相关疑难解决方法(0)

如何克隆或复制列表?

在Python中克隆或复制列表有哪些选项?

在使用时new_list = my_list,每次都会对new_list更改进行任何修改my_list.为什么是这样?

python clone copy list

2289
推荐指数
16
解决办法
149万
查看次数

754
推荐指数
22
解决办法
55万
查看次数

了解dict.copy() - 浅或深?

在阅读文档时dict.copy(),它说它是字典的浅层副本.我所遵循的书(Beazley的Python参考书)也是如此,它说:

m.copy()方法生成映射对象中包含的项的浅表副本,并将它们放在新的映射对象中.

考虑一下:

>>> original = dict(a=1, b=2)
>>> new = original.copy()
>>> new.update({'c': 3})
>>> original
{'a': 1, 'b': 2}
>>> new
{'a': 1, 'c': 3, 'b': 2}
Run Code Online (Sandbox Code Playgroud)

所以我假设这会更新original(并添加'c':3)的值,因为我正在做一个浅拷贝.就像你为列表做的那样:

>>> original = [1, 2, 3]
>>> new = original
>>> new.append(4)
>>> new, original
([1, 2, 3, 4], [1, 2, 3, 4])
Run Code Online (Sandbox Code Playgroud)

这按预期工作.

由于两者都是浅拷贝,为什么dict.copy()它不能像我期望的那样工作?或者我对浅层和深层复制的理解是有缺陷的?

python

402
推荐指数
5
解决办法
22万
查看次数

id()函数用于什么?

我阅读了Python 2文档并注意到了这个id()函数:

返回对象的"标识".这是一个整数(或长整数),保证在该生命周期内该对象是唯一且恒定的.具有非重叠生存期的两个对象可以具有相同的id()值.

CPython实现细节:这是内存中对象的地址.

所以,我通过使用id()列表进行了实验:

>>> list = [1,2,3]
>>> id(list[0])
31186196
>>> id(list[1])
31907092 // increased by 896
>>> id(list[2])
31907080 // decreased by 12
Run Code Online (Sandbox Code Playgroud)

函数返回的整数是多少?它是C中内存地址的同义词吗?如果是这样,为什么整数不对应于数据类型的大小?

何时id()在实践中使用?

python

93
推荐指数
6
解决办法
9万
查看次数

Python通过分配复制?

我希望下面的代码只会初始化dict_a,dict_b以及dict_c字典.但它接触到副本通过效果:

dict_a = dict_b = dict_c = {}
dict_c['hello'] = 'goodbye'

print dict_a
print dict_b
print dict_c
Run Code Online (Sandbox Code Playgroud)

如您所见,结果如下:

{'hello': 'goodbye'}
{'hello': 'goodbye'}
{'hello': 'goodbye'}
Run Code Online (Sandbox Code Playgroud)

为什么该程序会给出以前的结果,当我希望它返回时:

{}
{}
{'hello': 'goodbye'}
Run Code Online (Sandbox Code Playgroud)

python

43
推荐指数
2
解决办法
4万
查看次数

在Python中,如果我输入a = 1 b = 2 c = ac = b,c的值是多少?c指向什么?

Python变量在很大程度上很容易理解,但有一个案例我一直在努力.如果我想将变量指向新的内存地址,我该怎么做?或者,如果Python默认执行此操作(处理指针之类的变量),那么如何将新变量的值字面分配给旧变量的内存地址?

例如,如果我输入

a=1
b=2
c=a
c=b
Run Code Online (Sandbox Code Playgroud)

有什么价值c?它指向什么?是语句代替指针c -> a与指针c -> b或抓住从价值b和覆盖ab的价值?c=b很暧昧.

换句话说,如果你从这开始:

a -> 1 <- c
b -> 2
Run Code Online (Sandbox Code Playgroud)

它重新指向c这样:

a -> 1    _c
b -> 2 <-/
Run Code Online (Sandbox Code Playgroud)

b像这样复制?

a -> 2 <- c
b -> 2
Run Code Online (Sandbox Code Playgroud)

python

7
推荐指数
3
解决办法
1647
查看次数

在`x = xy()`之后,为什么`x`变成了`None`而不是被修改(可能导致“AttributeError:'NoneType'对象没有属性”)?

如果您的问题作为此问题的重复项而被关闭,那是因为您有一些通用形式的代码

x = X()
# later...
x = x.y()
# or:
x.y().z()
Run Code Online (Sandbox Code Playgroud)

其中X是某种类型,它提供了y旨在z变异修改)对象(X类型的实例)的方法。这可以适用于:

  • 可变的内置类型,例如listdictsetbytearray
  • 标准库(尤其是 Tkinter 小部件)或第三方库提供的类。

这种形式的代码很常见,但并不总是错误的。问题的明显迹象是:

  • x.y().z()一样,会引发异常AttributeError: 'NoneType' object has no attribute 'z'

  • 有了x = x.y(),x就变成None, 而不是被修改的对象。这可能会被后来的错误结果发现,或者被像上面这样的异常(x.z()稍后尝试时)发现。

Stack Overflow 上有大量关于这个问题的现有问题,所有这些问题实际上都是同一个问题。之前甚至有多次尝试在特定上下文中涵盖同一问题的规范。然而,理解问题并不需要上下文,因此这里尝试一般性地回答:

代码有什么问题吗?为什么这些方法会这样,我们如何解决这个问题?


另请注意,当尝试使用 alambda或列表理解)来产生副作用时,会出现类似的问题。

同样明显的问题可能是由因其他原因返回的方法引起的None …

python attributeerror command-query-separation nonetype

7
推荐指数
1
解决办法
577
查看次数

在python中使用[:]或copy()复制列表很浅?

说我有一个a带有一些值的列表,我做了一个b = a[:].然后修改列表的内容b将不会a根据我读过的内容更改列表.所以,这意味着它的深层次.但python文档仍然将此称为浅拷贝.有人能为我清楚这个吗?

python python-3.x

5
推荐指数
2
解决办法
565
查看次数

Python 的 copy.deepcopy 真的复制所有内容吗?

我的印象是深度复制将所有内容递归地复制到树上,但我遇到的情况似乎与我之前的想法背道而驰。

>>> item = "hello"
>>> a["hello"] = item
>>> b = copy.deepcopy(a)
>>> id(a)
31995776
>>> id(b)
32733616             # I expected this
>>> id(a["hello"])
140651836041376
>>> id(b["hello"])
140651836041376      # I did not expect this
Run Code Online (Sandbox Code Playgroud)

a 和 b 的 id 不同,这是我所期望的,但内部项仍然是同一个对象。deepcopy 只能复制到一定深度吗?或者这是 Python 存储字符串的特定方式?(我也得到了与整数类似的结果)

python copy deep-copy python-2.7

3
推荐指数
1
解决办法
1185
查看次数

赋值算子左/右侧的不同切片行为

作为来自C++背景的Python新手,Python(3.4.x)中的切片运算符对我来说看起来很荒谬.我只是没有得到"特殊规则"背后的设计理念.让我解释为什么我说它是"特殊的".

一方面,根据此处的Stack Overflow答案,切片运算符创建列表或列表的一部分(深度)副本,即新列表.链接可能是旧的(早于python 3.4.x),但我刚用python 3.4.2进行了以下简单实验确认了这种行为:

words = ['cat', 'window', 'defenestrate']
newList = words[:] # new objects are created; a.k.a. deep copy
newList[0] = 'dog'

print(words) # ['cat' ...
print(newList) # ['dog' ...
Run Code Online (Sandbox Code Playgroud)

另一方面,根据这里的官方文件:

Assignment to slices is also possible, and this can even change the size of the list or clear it entirely:
>>>

>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> letters ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> …
Run Code Online (Sandbox Code Playgroud)

python operators deep-copy slice python-3.x

3
推荐指数
1
解决办法
662
查看次数