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

应该怎么写 ?

参考技术A

    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 字典的引用的主要内容,如果未能解决你的问题,请参考以下文章

python 列表和字典的引用与复制(copy)

为 CSV 阅读器引用 Python 字典中的键

引用存储在 Python 字典对象中的 pandas DataFrame 的特定列

python 嵌入在python字典中的链表,用于快速引用

python将字典追加到列表

Python字典的实现原理