python 字典的引用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 字典的引用相关的知识,希望对你有一定的参考价值。
class Map(object):
scenes =
'central_corridor': CentralCorridor(),
'laser_weapon_armory': LastWeaporArmory(),
'the_bridge': TheBridge(),
'escape_pod': EscapePod(),
'death': Death(),
'finished': Finished(),
def __int__(self, start_scene):
self.start_scene = start_scene
def next_scene(self, scene_name):
val = Map.scenes.get(scene_name)
return val
def open_scene(self):
return self.next_scene(self.start_scene)
a_map = Map('central_corridor')
a_game = Engine(a_map)
a_game.play()
各位大神。请帮忙看看为什么a_map = Map('central_corridor')最后调用字典,报错提示
a_map = Map('central_corridor')
TypeError: Map() takes no arguments
应该怎么写 ?
python中把一个字典的value赋值给变量,修改变量,被引用是字典的value也会被修改。
值的注意的是,字典里的Key和Value都是对象的引用,不是对象本身。引用没有变,变得只是引用地址空间的值。
实测该情况,对于value为字典或者列表的引用赋值,之后修改后,原有字典的value被修改。
猜测字典,列表,集合引用的是地址空间里的值,这些数据类型会被修改。
python将字典追加到列表
【中文标题】python将字典追加到列表【英文标题】:python append dictionary to list 【发布时间】:2018-03-01 13:39:30 【问题描述】:根据this 的帖子,如果我想引用一个循环更新的字典(而不是总是引用同一个字典),我需要在字典上使用.copy()
。但是,在我下面的代码示例中,这似乎不起作用:
main.py
:
import collections
import json
nodes_list = ['donald', 'daisy', 'mickey', 'minnie']
edges_list = [('donald', 'daisy', '3'), ('mickey', 'minnie', '3'), ('daisy', 'minnie', '2')]
node_dict, edge_dict = collections.defaultdict(dict), collections.defaultdict(dict)
ultimate_list = []
for n in nodes_list:
node_dict["data"]["id"] = str(n)
ultimate_list.append(node_dict.copy())
for e in edges_list:
edge_dict["data"]["id"] = str(e[2])
edge_dict["data"]["source"] = e[0]
edge_dict["data"]["target"] = e[1]
ultimate_list.append(edge_dict.copy())
print(json.dumps(ultimate_list, indent=2))
因此,我得到以下结果:
[
"data":
"id": "minnie"
,
"data":
"id": "minnie"
,
"data":
"id": "minnie"
,
"data":
"id": "minnie"
,
"data":
"target": "minnie",
"id": "2",
"source": "daysi"
,
"data":
"target": "minnie",
"id": "2",
"source": "daysi"
,
"data":
"target": "minnie",
"id": "2",
"source": "daysi"
]
而我实际上希望得到这个:
[
"data":
"id": "donald"
,
"data":
"id": "daisy"
,
"data":
"id": "mickey"
,
"data":
"id": "minnie"
,
"data":
"target": "donald",
"id": "3",
"source": "daysi"
,
"data":
"target": "mickey",
"id": "3",
"source": "minnie"
,
"data":
"target": "minnie",
"id": "2",
"source": "daysi"
]
谁能告诉我我在这里做错了什么?
【问题讨论】:
ultimate_list
听起来很特别
【参考方案1】:
dict.copy
只制作字典的浅拷贝,嵌套字典永远不会被复制,您也需要深拷贝才能将它们复制过来。
但是,您可以简单地在循环的每次迭代中定义每个新字典,并在该迭代中附加新字典:
for n in nodes_list:
node_dict = collections.defaultdict(dict) # create new instance of data structure
node_dict["data"]["id"] = str(n)
ultimate_list.append(node_dict)
同样适用于edge_dict
:
for e in edges_list:
edge_dict = collections.defaultdict(dict)
...
ultimate_list.append(edge_dict)
【讨论】:
现在工作。非常感谢!【参考方案2】:使用copy.deepcopy(your_dict)
:deepcopy。
【讨论】:
【参考方案3】:我看到了一些东西。根据您想要的结果,您的 edge_list 有点偏离。
变化:
('daisy', 'minnie', '2')
收件人:
('minnie', 'daisy', '2')
要以您希望的方式在所需的输出中创建数据,我们可以使用更基本的 dicts 方法来做到这一点。
如果您试图匹配问题中的预期结果,那么您在 for e in edges_list
函数中调用了错误的索引。
应该是:
"target" : e[0]
"id" : str(e[2])
"source" : e[1]
首先我删除了
node_dict, edge_dict = collections.defaultdict(dict), collections.defaultdict(dict)
因为我的方法不需要它。
接下来我改变了你定义数据的方式。
我们可以直接将每组数据的结果附加到ultimate_list
,而不是使用预定义的字典。这会缩短代码并且更容易设置。
for n in nodes_list:
ultimate_list.append("data" : "id" : str(n))
for e in edges_list:
ultimate_list.append("data" : "target" : e[0], "id" : str(e[2]), "source" : e[1])
print(json.dumps(ultimate_list, indent=2))
所以下面的代码:
import collections
import json
nodes_list = ['donald', 'daisy', 'mickey', 'minnie']
edges_list = [('donald', 'daisy', '3'), ('mickey', 'minnie', '3'), ('minnie', 'daisy', '2')]
ultimate_list = []
for n in nodes_list:
ultimate_list.append("data" : "id" : str(n))
for e in edges_list:
ultimate_list.append("data" : "target" : e[0], "id" : str(e[2]), "source" : e[1])
print(json.dumps(ultimate_list, indent=2))
应该导致:
[
"data":
"id": "donald"
,
"data":
"id": "daisy"
,
"data":
"id": "mickey"
,
"data":
"id": "minnie"
,
"data":
"target": "donald",
"id": "3",
"source": "daisy"
,
"data":
"target": "mickey",
"id": "3",
"source": "minnie"
,
"data":
"target": "minnie",
"id": "2",
"source": "daisy"
]
【讨论】:
感谢您提供更优雅的解决方案!以上是关于python 字典的引用的主要内容,如果未能解决你的问题,请参考以下文章