【发布时间】:2014-09-04 16:15:05
【问题描述】:
在 python 中,我在使用 itertools groupby 模块时遇到了这种奇怪的现象。
在python中,变量赋值意味着将新变量分配给自己的内存而不是指向原始内存的指针(根据我的理解,如果这是不正确的,请告诉我):
y = 7
x = y
y = 9
x will still be 7
然而,当我使用 groupby 模块时,我使用这个模块将具有相同键的项目分组到一个组中。我想要两个组,因为重复原始组是没有用的,因为内存已经被修改了。示例:
for key, group in groupby(rows, lambda x: x[0]):
data = [thing[1] for thing in group] #accesses 1st attribute of element
data2 = [thing[2] for thing in group] # would yield [] as group is empty
所以我尝试了这个:
for key, group in groupby(rows, lambda x: x[0]):
#create a copy of group to reiterate over
toup = group
print toup #<itertools._grouper object at 0x1039a8850>
print group #<itertools._grouper object at 0x1039a8850>
data = [thing[1] for thing in group] #accesses 1st attribute of element
data2 = [thing[2] for thing in toup]
data2 应该访问第二个项目,但会产生 [],因为它们共享相同的内存
我的问题是为什么会这样?不应该将组分配给 toup 意味着 toup 将在不同的十六进制地址位置拥有组内存的副本吗?
我还能做些什么来规避这个问题,这样我就不必编写两个 groupby 迭代了?
【问题讨论】:
-
这取决于变量的类型。如果将整数和字符串等原语分配给另一个变量,则会复制它们,而实例对象则不会 - 变量将成为对实例对象的引用。试试 "a= []; b= a; print(a is b)" - 这将打印 True。
-
“变量赋值意味着为新变量分配它自己的内存而不是指向原始内存的指针” - 不正确,这不是 Python 名称的工作方式(参见例如 @987654321 @)。使用
toup = group[:]创建副本。 -
@Rawing 不正确(首先,Python 并没有真正的原语,例如整数 are 实例);不同之处在于,例如整数是不可变的,而例如列表是可变的。
a = 1; b = a; a is b仍然是True,只是b += 1不会影响a(因为整数是不可变的)。 -
@jonrsharpe:我明白了,感谢您的更正。