字典中的易变性

>>> 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

回到顶部