Hướng dẫn can you modify a list in a function python? - bạn có thể sửa đổi một danh sách trong một hàm python không?

60

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Giả sử tôi có chức năng với tham số danh sách và bên trong cơ thể của nó, tôi muốn sửa đổi danh sách đã được thông qua, bằng cách sao chép các phần tử của một mảng vào danh sách:

def function1 (list_arg):
   a = function2()    #function2 returns an array of numbers
   list_arg = list(a)

list1 = [0] * 5
function1(list1)
list1
[0,0,0,0,0]

Khi làm điều đó như thế này, nó không hoạt động. Sau khi thực hiện function1(list1),

list_arg[:] = list(a)
0 vẫn không thay đổi. Vì vậy, làm thế nào để làm cho
list_arg[:] = list(a)
1 trả về
list_arg[:] = list(a)
0 với các phần tử (số) giống như mảng
list_arg[:] = list(a)
3?

Hướng dẫn can you modify a list in a function python? - bạn có thể sửa đổi một danh sách trong một hàm python không?

Martineau

Huy hiệu vàng 116K2525 gold badges160 silver badges285 bronze badges

Đã hỏi ngày 26 tháng 2 năm 2014 lúc 22:20Feb 26, 2014 at 22:20

Hướng dẫn can you modify a list in a function python? - bạn có thể sửa đổi một danh sách trong một hàm python không?

4

Nếu bạn gán một cái gì đó cho biến

list_arg[:] = list(a)
4, nó sẽ từ đó vào điểm đến giá trị mới. Giá trị mà nó chỉ ra trước khi chuyển nhượng đó (danh sách ban đầu của bạn) sẽ không thay đổi.

Nếu bạn, thay vào đó, gán một cái gì đó cho các yếu tố của danh sách đó, điều này sẽ thay đổi danh sách ban đầu:

list_arg[:] = list(a)

Điều này sẽ làm cho mã của bạn hoạt động như bạn muốn.

Nhưng hãy nhớ rằng những thay đổi tại chỗ rất khó hiểu và có lẽ có thể gây nhầm lẫn cho nhà phát triển tiếp theo phải duy trì mã của bạn.

Đã trả lời ngày 26 tháng 2 năm 2014 lúc 22:38Feb 26, 2014 at 22:38

Hướng dẫn can you modify a list in a function python? - bạn có thể sửa đổi một danh sách trong một hàm python không?

AlfealfeAlfe

53.5K19 Huy hiệu vàng100 Huy hiệu bạc152 Huy hiệu đồng19 gold badges100 silver badges152 bronze badges

3

Những gì tôi nghĩ rằng bạn đang hỏi là tại sao sau khi gọi

list_arg[:] = list(a)
5, khi
list_arg[:] = list(a)
6 đánh giá lại
list_arg[:] = list(a)
3 bạn đã vượt qua,
list_arg[:] = list(a)
3 vẫn là "
list_arg[:] = list(a)
3 cũ" bạn đã vượt qua.

Lý do cho điều này là cách Python xử lý các biến và chuyển chúng đến các chức năng. Chúng được thông qua bởi tham chiếu, nhưng tham chiếu được truyền bởi giá trị (có nghĩa là một bản sao được tạo). Điều này có nghĩa là tài liệu tham khảo bạn có bên trong

list_arg[:] = list(a)
6 thực sự là một bản sao của tài liệu tham khảo bạn đã đi qua. Điều này một lần nữa ngụ ý rằng nếu bạn phân công lại biến bên trong hàm. Nó là một biến cục bộ chỉ tồn tại bên trong hàm; Gán lại nó sẽ không thay đổi bất cứ điều gì trong phạm vi bên ngoài.

Bây giờ, nếu bạn thay vì chỉ định lại biến/tham chiếu cục bộ bên trong

list_arg[:] = list(a)
6 (không hoạt động, vì đó là bản sao) thực hiện các hoạt động có thể thay đổi trên đó, chẳng hạn như
def function1 (list_arg):
   list_arg.append(5)
2, danh sách bạn vượt qua sẽ thay đổi sau khi đã hoàn thành.

Xem thêm câu hỏi Làm cách nào để chuyển một biến bằng cách tham khảo? trong đó xử lý vấn đề và các giải pháp có thể chi tiết hơn.

TL; DR: Việc chỉ định lại một biến bên trong một hàm sẽ không thay đổi biến bạn đã truyền dưới dạng đối số bên ngoài hàm. Thực hiện các hoạt động có thể thay đổi trên biến, tuy nhiên, sẽ thay đổi nó. Reassigning a variable inside a function won't change the variable you passed as an argument outside the function. Performing mutable operations on the variable, however, will change it.

Đã trả lời ngày 26 tháng 2 năm 2014 lúc 22:38Feb 26, 2014 at 22:38

AlfealfeHåvard S

53.5K19 Huy hiệu vàng100 Huy hiệu bạc152 Huy hiệu đồng6 gold badges59 silver badges71 bronze badges

Những gì tôi nghĩ rằng bạn đang hỏi là tại sao sau khi gọi

list_arg[:] = list(a)
5, khi
list_arg[:] = list(a)
6 đánh giá lại
list_arg[:] = list(a)
3 bạn đã vượt qua,
list_arg[:] = list(a)
3 vẫn là "
list_arg[:] = list(a)
3 cũ" bạn đã vượt qua.

def function1 (list_arg):
   list_arg.append(5)

Lý do cho điều này là cách Python xử lý các biến và chuyển chúng đến các chức năng. Chúng được thông qua bởi tham chiếu, nhưng tham chiếu được truyền bởi giá trị (có nghĩa là một bản sao được tạo). Điều này có nghĩa là tài liệu tham khảo bạn có bên trong

list_arg[:] = list(a)
6 thực sự là một bản sao của tài liệu tham khảo bạn đã đi qua. Điều này một lần nữa ngụ ý rằng nếu bạn phân công lại biến bên trong hàm. Nó là một biến cục bộ chỉ tồn tại bên trong hàm; Gán lại nó sẽ không thay đổi bất cứ điều gì trong phạm vi bên ngoài.

def function1 (list_arg):
   print 1, id(list_arg)
   list_arg[:] = ["a", "b", "c"]
   print 2, id(list_arg)
   list_arg = range(10)
   print 3, id(list_arg)

x = [1,2,3]
function1(x)
print x

prints:

1 4348413856
2 4348413856
3 4348411984
['a', 'b', 'c']

Bây giờ, nếu bạn thay vì chỉ định lại biến/tham chiếu cục bộ bên trong

list_arg[:] = list(a)
6 (không hoạt động, vì đó là bản sao) thực hiện các hoạt động có thể thay đổi trên đó, chẳng hạn như
def function1 (list_arg):
   list_arg.append(5)
2, danh sách bạn vượt qua sẽ thay đổi sau khi đã hoàn thành.

Xem thêm câu hỏi Làm cách nào để chuyển một biến bằng cách tham khảo? trong đó xử lý vấn đề và các giải pháp có thể chi tiết hơn.Feb 26, 2014 at 22:24

tom10tom10tom10

TL; DR: Việc chỉ định lại một biến bên trong một hàm sẽ không thay đổi biến bạn đã truyền dưới dạng đối số bên ngoài hàm. Thực hiện các hoạt động có thể thay đổi trên biến, tuy nhiên, sẽ thay đổi nó.9 gold badges122 silver badges134 bronze badges

1

Håvard Shåvard s

def function1 (list_arg):

22,5K6 Huy hiệu vàng59 Huy hiệu bạc71 Huy hiệu đồng

   list_arg = list(a)

Bạn có thể hoạt động trong danh sách để thay đổi các giá trị của nó (ví dụ: nối một cái gì đó vào nó hoặc đặt các giá trị của nó) nhưng các thay đổi sẽ được phản ánh bên ngoài chức năng chỉ khi bạn hoạt động trên tham chiếu đến đối tượng được truyền trong đối tượng:

Nếu bạn có câu hỏi khi làm điều này, hãy in ra

def function1 (list_arg):
   list_arg.append(5)
4s:

def function1 ():
   'a = some array'
   return list(a)

list1 = [0] * 5
list1 = function1()

Đó là,

def function1 (list_arg):
   list_arg.append(5)
5 được thay đổi tại chỗ, nhưng việc gán cho biến cục bộ của hàm
list_arg[:] = list(a)
4 không có tác động đến
def function1 (list_arg):
   list_arg.append(5)
5, bởi vì sau đó chỉ gán một đối tượng khác cho
list_arg[:] = list(a)
4.

def function1(list_arg):
    del list_arg[:]  # Clears the array
    'a = some array'
    list_arg.extend(a)

Đã trả lời ngày 26 tháng 2 năm 2014 lúc 22:24Feb 26, 2014 at 22:30

64,9K9 Huy hiệu vàng122 Huy hiệu bạc134 Huy hiệu đồngGeoff Genz

Bạn đang thay đổi một tham chiếu đến một biến cục bộ. Khi bạn vượt qua list_arg theo cách này:16 silver badges20 bronze badges

Một danh sách có thể được sửa đổi trong một chức năng Python?

Và trong khi hầu hết các loại dữ liệu chúng tôi đã làm việc trong Python giới thiệu là bất biến (bao gồm số nguyên, phao, dây, booleans và bộ dữ liệu), danh sách và từ điển là có thể thay đổi. Điều đó có nghĩa là một danh sách toàn cầu hoặc từ điển có thể được thay đổi ngay cả khi nó được sử dụng bên trong một hàm, giống như chúng ta đã thấy trong các ví dụ trên.lists and dictionaries are mutable. That means a global list or dictionary can be changed even when it's used inside of a function, just like we saw in the examples above.

Làm thế nào để bạn cập nhật một danh sách trong Python với một chức năng?

Bộ Python |CẬP NHẬT () Tham số: Phương thức Update () chỉ lấy một đối số duy nhất.Đối số duy nhất có thể là một tập hợp, danh sách, bộ dữ liệu hoặc từ điển.Nó tự động chuyển đổi thành một tập hợp và thêm vào tập hợp. Parameters : Update() method takes only a single argument. The single argument can be a set, list, tuples or a dictionary. It automatically converts into a set and adds to the set.

Chức năng Python có thể lấy danh sách không?

Bạn có thể gửi bất kỳ loại dữ liệu nào của đối số đến một hàm (chuỗi, số, danh sách, từ điển, v.v.) và nó sẽ được coi là cùng một loại dữ liệu bên trong hàm. (string, number, list, dictionary etc.), and it will be treated as the same data type inside the function.

Làm thế nào để bạn sửa đổi một biến trong một chức năng Python?

Sử dụng từ khóa toàn cầu † để sửa đổi biến toàn cầu bên trong một hàm.Nếu chức năng của bạn có một biến cục bộ có cùng tên với biến toàn cầu và bạn muốn sửa đổi chức năng biến toàn cầu bên trong thì hãy sử dụng từ khóa 'toàn cầu' trước tên biến khi bắt đầu chức năng, tức là.. If your function has a local variable with same name as global variable and you want to modify the global variable inside function then use 'global' keyword before the variable name at start of function i.e.