我有一个类似的代码从下面的一个为我的工作,我不知道为什么它不正确地改变全局DF变量的嵌套数组的循环。
>> df1 = pd.DataFrame({
>> 'x': [1,2,3,4,5],
>> 'y': ['a', 'b', 'c', 'd', 'e']
>> })
>> df2 = df1
>> for array in [[df1, 9], [df2, 'z']]:
>> array[0]['x'] = array[1]
>> array[0]['y'] = array[1]
>> print(array[0])
x y
0 9 9
1 9 9
2 9 9
3 9 9
4 9 9
x y
0 z z
1 z z
2 z z
3 z z
4 z z
>> print(df1)
x y
0 z z
1 z z
2 z z
3 z z
4 z z
>> print(df2)
x y
0 z z
1 z z
2 z z
3 z z
4 z z
所以在第一次迭代中我们看到了正确的变化,df1的两列都是9,df2的两列都是z,但是当我们检查全局变量时,我们看到所有的变量都是z,甚至df1,我不知道为什么。
1条答案
按热度按时间lhcgjxsq1#
当Python中的对象是可变的时,您通过引用而不是通过值来复制。
int
和str
是不可变的对象类型,但list
、dict
和pandas.DataFrame
是可变的。请参阅以下示例了解int
和list
的含义:因此,当你赋值
df2
时,你赋值给了df1
所引用的对象,也就是说,当你改变df2
时,你也改变了df1
所引用的对象,因为它实际上是同一个对象,你可以使用内置的id()
函数来检查这一点:要获得同一 Dataframe 的新拷贝,您需要使用
copy()
: