相关疑难解决方法(0)

为什么这个python生成器每次都返回相同的值?

这是我的发电机:

def gen():
    state = [None]

    for i in range(5):
        state[0] = i
        yield state
Run Code Online (Sandbox Code Playgroud)

当我调用它时,这是输出:

>>> list(gen())
[[4], [4], [4], [4], [4]]
Run Code Online (Sandbox Code Playgroud)

如果我再次执行该语句,我得到的东西[4](由于[[0], [1], [2], [3], [4]]调用),但所有的相同的值[4].

python yield generator

8
推荐指数
2
解决办法
1718
查看次数

Python:追加原始对象与追加对象的副本

首先,对不起,如果这个问题非常基本,我只是从 Python 开始。

我在理解 Python 3.6 如何创建对象并将其附加到列表时遇到问题。请参阅以下代码:

a_dict=dict()
a_list=list()

for i in range(100):
  a_dict['original'] = i
  a_dict['multi'] = i*2
  a_list.append(a_dict)
Run Code Online (Sandbox Code Playgroud)

列表的打印如下

print(a_list)
>>[{'original': 99, 'multi': 198}{'original': 99, 'multi': 198}...{'original': 99, 'multi': 198}]
Run Code Online (Sandbox Code Playgroud)

按照我原来的想法,i=0 -> original=0, multi=0; i=1 -> 原始=1,多=2;等等...

但是,根据这里的这个问题,Python 的 append() 附加了一个指向对象的指针,而不是实际值。因此,我将原始代码上的 append(original) 更改为 append(copy):

a_dict=dict()
a_list=list()

for i in range(100):
  a_dict['original'] = i
  a_dict['multi'] = i*2
  a_list.append(a_dict.copy()) ##change here
Run Code Online (Sandbox Code Playgroud)

现在,我得到了想要的结果:

print(a_list)
[{'original': 0, 'multi': 0}, {'original': 1, 'multi': 2}, {'original': 2, 'multi': 4},...]    
Run Code Online (Sandbox Code Playgroud)

现在,这是我的问题:

append() 如何真正起作用?是否总是列表包含指向其原始对象的类似指针的对象?其他类型呢?如果我的意图不是直接弄乱原始值或我正在使用的列表/容器,我应该总是使用 …

python pointers copy list append

8
推荐指数
1
解决办法
2万
查看次数

list append替换以前附加的值

我试图将字典附加到列表中,问题是在将"Chrome"和"Firefox"值附加到"列表"后,我在列表中只看到两个条目的firefox.exe.

任何帮助真的很感激.请参阅字典的print语句,其中两个值都不同.

MyItems = ["ChromeSetup.exe","firefox.exe"]
listofitems = [{"appId": "ChromeID", 'id': "0","name": 'ChromeSetup.exe','_id': 'ChromeUnique'},{"appId": "FireFoxID", 'id': "0","name": 'firefox.exe','_id': 'FireFoxUnique'} ]

__id = ""
appId = ""
result = []
Dict = {"installerParameters":"","managedApp":{"_id":__id, "appId":appId},"postInstallAction":0,"postInstallScript":{"_id":"0"},"preInstallScript":{"_id":"0"}}

for app in MyItems:
    for items in listofitems:
        if items['name'] == app:
            Dict["managedApp"]["_id"] = items['_id']
            Dict["managedApp"]["appId"] = items['appId']
            print("Dictionery",Dict)
            result.append(Dict)
            break

print("See the List", result)
Run Code Online (Sandbox Code Playgroud)

结果:

Dictionery {'installerParameters': '', 'managedApp': {'_id': 'ChromeUnique', 'appId': 'ChromeID'}, 'postInstallAction': 0, 'postInstallScript': {'_id': '0'}, 'preInstallScript': {'_id': '0'}}
Dictionery {'installerParameters': '', 'managedApp': {'_id': 'FireFoxUnique', …
Run Code Online (Sandbox Code Playgroud)

python list python-3.x

2
推荐指数
1
解决办法
84
查看次数

标签 统计

python ×3

list ×2

append ×1

copy ×1

generator ×1

pointers ×1

python-3.x ×1

yield ×1