为啥局部变量会自我更新? [复制]

Posted

技术标签:

【中文标题】为啥局部变量会自我更新? [复制]【英文标题】:Why a local variable is updating itself? [duplicate]为什么局部变量会自我更新? [复制] 【发布时间】:2019-06-22 15:40:05 【问题描述】:

我有以下代码:

file = open('MyCSV.csv') # this read the Headers name
reader = csv.reader(file)
Data = next(reader,None)
Data = Data[1:]
DataTmp = Data


for item in DataM: # DataM is a list with one element from Data
    Data.remove(item) #remove one item


#
print(len(Data))
print(len(DataTmp))

所以,我打开MyCSV.csv 文件,读取标题行,并将其存储在变量Data 中。我还通过DataTmp 复制了Data。最初,列表Data 有10 个元素。

然后,我从Data 中删除了一个元素。

现在,我希望Data 的长度是9,而DataTmp 的长度仍然是10。但是,我得到的答案是DataTmp 的长度也是9。为什么?我从未更改过DataTmp,我在从Data 中删除元素之前定义了它。

感谢您的帮助!

【问题讨论】:

DataTmp = Data 使它们成为相同的对象。那不会复制。影响一个会影响另一个。 @Carcigenicate 谢谢!现在我明白了。我曾经使用 Matlab 而不是 python,我想这是我学到的第一个“大”差异。 是的,我很确定就在几天前,我从 MATLAB 的其他人那里看到了类似的问题。这似乎是一个常见的混淆点。 【参考方案1】:

重要的变化是

import copy

DataTmp = copy.copy(Data) # Use this instead of direct assignment.

代替

DataTmp = Data

使用下面的代码。

import copy

file = open('MyCSV.csv') # this read the Headers name
reader = csv.reader(file)
Data = next(reader,None)
Data = Data[1:]
# DataTmp = Data
DataTmp = copy.copy(Data) # Use this instead of direct assignment.

for item in DataM: # DataM is a list with one element from Data
    Data.remove(item) #remove one item

#
print(len(Data))
print(len(DataTmp))

【讨论】:

以上是关于为啥局部变量会自我更新? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

要同步哪些对象?为啥局部变量不好? [复制]

为啥即使使用 setlocal enabledelayedexpansion 也无法访问 for 循环(批处理文件)中的局部变量? [复制]

为啥这个 (null || !TryParse) 条件会导致“使用未分配的局部变量”?

为啥我的线程函数中的局部变量会被其他线程中断?

为啥此 C# 代码会引发错误:使用未分配的局部变量 'n'

为啥尚未定义的局部范围变量引用同名的实例变量?