Tôi đã dành 2 giờ cuối cùng cho điều này và tôi có thể đã đọc mọi câu hỏi ở đây liên quan đến các biến được chuyển đến hàm. Vấn đề của tôi là vấn đề chung của tham số/đối số bị ảnh hưởng bởi các thay đổi được thực hiện bên trong hàm, mặc dù tôi đã xóa tham chiếu/bí danh bằng cách sử dụng variable_cloned = variable[:]
trong hàm để sao chép nội dung mà không cần tham chiếu.Đối số/tham số đã qua trong hàm vẫn đang được thay đổi sau khi xóa tham chiếu/bí danh
Đây là mã:
def add_column(m):
#this should "clone" m without passing any reference on
m_cloned = m[:]
for index, element in enumerate(m_cloned):
# parameter m can be seen changing along with m_cloned even
# though 'm' is not touched during this function except to
# pass it's contents onto 'm_cloned'
print "This is parameter 'm' during the for loop...", m
m_cloned[index] += [0]
print "This is parameter 'm' at end of for loop...", m
print "This is variable 'm_cloned' at end of for loop...", m_cloned
print "m_cloned is m =", m_cloned is m, "implies there is no reference"
return m_cloned
matrix = [[3, 2], [5, 1], [4, 7]]
print "\n"
print "Variable 'matrix' before function:", matrix
print "\n"
add_column(matrix)
print "\n"
print "Variable 'matrix' after function:", matrix
Những gì tôi đang nhận thấy là các tham số 'm' trong hàm đang thay đổi như thể là một bí danh của m_cloned - nhưng như xa như tôi có thể nói tôi có loại bỏ bí danh với dòng đầu tiên của hàm. Ở khắp mọi nơi khác tôi đã xem trực tuyến dường như đề nghị rằng dòng này sẽ đảm bảo không có tham chiếu đến tham số - nhưng nó không hoạt động.
Tôi chắc rằng tôi đã mắc phải một lỗi đơn giản nhưng sau 2 giờ tôi không nghĩ mình sẽ tìm thấy nó.
"... mặc dù tôi đã xóa tham chiếu/bí danh bằng cách sử dụng variable_cloned = biến [:] trong hàm để sao chép nội dung mà không cần tham chiếu. " Điều này làm cho 'variable_cloned' tham chiếu đến một danh sách riêng biệt từ' biến', nhưng hai danh sách sẽ chứa nội dung giống nhau: tham chiếu đến ba danh sách (2 mục) của bạn. –