11
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.
Đây là mã giả mà tôi đã viết mô tả vấn đề của tôi:-
func(s): #returns a value of s x = a list of strings print func(x) print x #these two should give the SAME outputKhi tôi in giá trị của X cuối cùng, tôi muốn nó trở thành một cái được trả lại bởi func (x). Tôi có thể làm điều gì đó như thế này chỉ bằng cách chỉnh sửa chức năng (và không cài đặt func(s): s[:] = whatever after mutating return s x = a list of strings print func(x) print x 2)
Hỏi ngày 11 tháng 7 năm 2015 lúc 17:06Jul 11, 2015 at 17:06
2
func(s): s[:] = whatever after mutating return s x = a list of strings print func(x) print x
Bạn thực sự không cần phải trả lại bất cứ điều gì:
def func(s): s[:] = [1,2,3] x = [1,2] print func(x) print x # -> [1,2,3]Tất cả phụ thuộc vào những gì bạn thực sự đang làm, việc thêm hoặc bất kỳ đột biến trực tiếp nào của danh sách sẽ được phản ánh bên ngoài chức năng khi bạn thực sự thay đổi đối tượng/danh sách ban đầu được truyền lại. Nếu bạn đang làm điều gì đó tạo ra một đối tượng mới và bạn muốn Các thay đổi được phản ánh trong danh sách được thông qua trong Cài đặt func(s): s[:] = whatever after mutating return s x = a list of strings print func(x) print x 3 sẽ thay đổi danh sách ban đầu.
Đã trả lời ngày 11 tháng 7 năm 2015 lúc 17:12Jul 11, 2015 at 17:12
3
Đó là cách nó hoạt động, chức năng có thể biến đổi danh sách
>>> l = ['a', 'b', 'c'] # your list of strings >>> def add_something(x): x.append('d') ... >>> add_something(l) >>> l ['a', 'b', 'c', 'd']Tuy nhiên, lưu ý rằng bạn không thể biến đổi danh sách ban đầu theo cách này
def modify(x): x = ['something'](Ở trên sẽ gán func(s): s[:] = whatever after mutating return s x = a list of strings print func(x) print x 4 nhưng không phải là danh sách ban đầu func(s): s[:] = whatever after mutating return s x = a list of strings print func(x) print x 5)
Nếu bạn muốn đặt một danh sách mới trong danh sách của mình, bạn sẽ cần một cái gì đó như:
def modify(x): x[:] = ['something']Đã trả lời ngày 11 tháng 7 năm 2015 lúc 17:09Jul 11, 2015 at 17:09
Bakkalbakkalbakkal
53.1K10 Huy hiệu vàng124 Huy hiệu bạc105 Huy hiệu đồng10 gold badges124 silver badges105 bronze badges
1
Các kiểu dữ liệu có thể thay đổi và bất biến trong Python gây ra rất nhiều vấn đề đau đầu cho các lập trình viên mới. Nói một cách đơn giản, các phương tiện có thể thay đổi có thể được thay đổi, và các phương tiện bất biến ’liên tục. Muốn đầu của bạn quay? Xem xét ví dụ này:
foo = ['hi'] print(foo) # Output: ['hi'] bar = foo bar += ['bye'] print(foo) # Output: ['hi', 'bye']
Điều gì vừa xảy ra? Chúng tôi đã không mong đợi điều đó! Chúng tôi đã mong đợi một cái gì đó như thế này:
foo = ['hi'] print(foo) # Output: ['hi'] bar = foo bar += ['bye'] print(foo) # Expected Output: ['hi'] # Output: ['hi', 'bye'] print(bar) # Output: ['hi', 'bye']
Nó không phải là một lỗi. Nó có thể đột biến trong hành động. Bất cứ khi nào bạn gán một biến cho một biến khác của kiểu dữ liệu có thể thay đổi, mọi thay đổi đối với dữ liệu đều được phản ánh bởi cả hai biến. Biến mới chỉ là một bí danh cho biến cũ. Điều này chỉ đúng với các kiểu dữ liệu có thể thay đổi. Dưới đây là GOTCHA liên quan đến các chức năng và các loại dữ liệu có thể thay đổi:
def add_to(num, target=[]): target.append(num) return target add_to(1) # Output: [1] add_to(2) # Output: [1, 2] add_to(3) # Output: [1, 2, 3]
Bạn có thể đã mong đợi nó sẽ hành xử khác nhau. Bạn có thể mong đợi rằng một danh sách mới sẽ được tạo khi bạn gọi func(s): s[:] = whatever after mutating return s x = a list of strings print func(x) print x 6 như thế này:
def add_to(num, target=[]): target.append(num) return target add_to(1) # Output: [1] add_to(2) # Output: [2] add_to(3) # Output: [3]
Một lần nữa, đó là sự biến đổi của các danh sách gây ra nỗi đau này. Trong Python, các đối số mặc định được đánh giá một lần khi hàm được xác định, không phải mỗi lần hàm được gọi. Bạn không bao giờ nên xác định các đối số mặc định của loại có thể thay đổi trừ khi bạn biết những gì bạn đang làm. Bạn nên làm điều gì đó như thế này:
func(s): s[:] = whatever after mutating return s x = a list of strings print func(x) print x 0
Bây giờ bất cứ khi nào bạn gọi hàm mà không có đối số func(s): s[:] = whatever after mutating return s x = a list of strings print func(x) print x 7, một danh sách mới sẽ được tạo. Ví dụ:
func(s): s[:] = whatever after mutating return s x = a list of strings print func(x) print x 1