字典中的易变性
>>> mydict = {1: {45: 'ades', 54:'adee'}, 2: {68: 'gdes'}} >>> curr_value = mydict[1][45]
>>> mydict[1][45] = 'zzzz'
>>> print (curr_value)
ades # Expected value: zzzz
我的curr_value
怎么没有从mydict
变异?我没有克隆curr_value
或任何东西。字典中的易变性
回答:
mydict = {1: {45: 'ades', 54:'adee'}, 2: {68: 'gdes'}} curr_value = mydict[1][45]
mydict[1][45] = 'zzzz'
print (curr_value)
print(mydict)
输出:
ades {1: {45: 'zzzz', 54: 'adee'}, 2: {68: 'gdes'}
你的字典是可变的 - 它发生了突变。 curr_value
是一个字符串,不可变。
Midly annoing想法:
def boll(tpl): return mydict[tpl[0]][tpl[1]]
mydict = {1: {45: 'ades', 54:'adee'}, 2: {68: 'gdes'}}
curr_value = (1,45)
print (boll(curr_value))
mydict[1][45] = 'zzzz'
print (boll(curr_value))
这只是encapsules记住你要引用的字典里面的点和funtion让你在你所说的那一刻字典的价值。
回答:
当更新其他数据结构时,无法创建“更新”自身的普通变量。这种行为只能通过某种表达来实现,例如属性或项目查找。换句话说,您可以创建一个对象curr_value
,以便在此刻评估curr_value[0]
为您提供mydict[1][45]
的值,或者评估curr_value.value
在此刻为您提供的值为mydict[1][45]
,但您无法使其仅仅为curr_value
进行评估当时的值为mydict[1][45]
。做curr_value = mydict[1][45]
总是将curr_value
设置为它分配给它的时间,如果mydict[1][45]
更改,它将不会更新。
回答:
因为简单赋值总是创建一个新的绑定(即,将新对象绑定到=
符号的LHS上的名称),所以您不想要什么。 OTOH,执行突变不会创建一个新的绑定,所以你可以做,例如
ref = mydict[1] mydict[1][45] = 'zzzz'
print(ref[45])
根据需要它打印zzzz
。
Stack Overflow老将Ned Batchelder在Facts and myths about Python names and values中很好地讲述了这个话题,并总结在Other languages have "variables", Python has "names"中。
另一种选择是做
mydict = {1: {45: ['ades'], 54:['adee']}, 2: {68: ['gdes']}} ref = mydict[1][45]
mydict[1][45][0]='zzzz'
print(ref[0])
一般来说,最好避免杂乱创造这样的,但有时那种事是非常有用的。例如,通过向2D列表添加额外的间接层,我们可以通过列和行来访问它。
# Create the grid rows = [[[u+v] for u in 'abcd'] for v in 'wxyz']
cols = [list(u) for u in zip(*rows)]
print(rows)
print(cols)
print()
# Mutate some grid cells
cell = rows[1][2]
cell[0] = cell[0].upper()
cell = cols[0][3]
cell[0] = cell[0].upper()
print(rows)
print(cols)
输出
[[['aw'], ['bw'], ['cw'], ['dw']], [['ax'], ['bx'], ['cx'], ['dx']], [['ay'], ['by'], ['cy'], ['dy']], [['az'], ['bz'], ['cz'], ['dz']]] [[['aw'], ['ax'], ['ay'], ['az']], [['bw'], ['bx'], ['by'], ['bz']], [['cw'], ['cx'], ['cy'], ['cz']], [['dw'], ['dx'], ['dy'], ['dz']]]
[[['aw'], ['bw'], ['cw'], ['dw']], [['ax'], ['bx'], ['CX'], ['dx']], [['ay'], ['by'], ['cy'], ['dy']], [['AZ'], ['bz'], ['cz'], ['dz']]]
[[['aw'], ['ax'], ['ay'], ['AZ']], [['bw'], ['bx'], ['by'], ['bz']], [['cw'], ['CX'], ['cy'], ['cz']], [['dw'], ['dx'], ['dy'], ['dz']]]
在这个答案的开始我说, “简单任务总是创建一个新的结合”。但是,augmented assignment将在可能的情况下执行就地操作,即目标是可变对象。从该文档:
像
x += 1
的增量赋值表达式可以改写为x = x + 1
来实现类似的,但不完全相等的效果。在 增强版本中,x只评估一次。另外,如果可能, 实际操作是就地执行的,这意味着创建一个新对象并将其分配给目标,而不是 而是修改旧对象 。
以上是 字典中的易变性 的全部内容, 来源链接: utcz.com/qa/260154.html