在Python中克隆或复制列表有哪些选项?
在使用时new_list = my_list
,每次都会对new_list
更改进行任何修改my_list
.为什么是这样?
我正在尝试理解Python的变量范围方法.在这个例子中,为什么f()
能够改变x
内部感知main()
的价值,而不是价值n
?
def f(n, x):
n = 2
x.append(4)
print('In f():', n, x)
def main():
n = 1
x = [0,1,2,3]
print('Before:', n, x)
f(n, x)
print('After: ', n, x)
main()
Run Code Online (Sandbox Code Playgroud)
输出:
Before: 1 [0, 1, 2, 3]
In f(): 2 [0, 1, 2, 3, 4]
After: 1 [0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud) 据我所知,Python中的变量只是指针.
基于此规则,我可以假设此代码段的结果:
i = 5
j = i
j = 3
print(i)
Run Code Online (Sandbox Code Playgroud)
会的3
.但是我得到了一个意想不到的结果,是的5
.
此外,我的Python书确实涵盖了这个例子:
i = [1,2,3]
j = i
i[0] = 5
print(j)
Run Code Online (Sandbox Code Playgroud)
结果将是[5,2,3]
.
我理解错了什么?
我听说在某些语言中被称为"盒装"的类型.
在Java中,我听说过"autoboxing".这是什么?它是否有类型的包装类?如果我使用盒装或非盒装类型,我的代码会如何变化?
例如:
a = some_process_that_generates_integer_result()
b = a
Run Code Online (Sandbox Code Playgroud)
有人告诉我,b和a将指向同一块整数对象,因此b将修改该对象的引用计数.代码PyObject* ast2obj_expr(void* _o)
在Python-ast.c中执行:
static PyObject* ast2obj_object(void *o)
{
if (!o)
o = Py_None;
Py_INCREF((PyObject*)o);
return (PyObject*)o;
}
......
case Num_kind:
result = PyType_GenericNew(Num_type, NULL, NULL);
if (!result) goto failed;
value = ast2obj_object(o->v.Num.n);
if (!value) goto failed;
if (PyObject_SetAttrString(result, "n", value) == -1)
goto failed;
Py_DECREF(value);
break;
Run Code Online (Sandbox Code Playgroud)
但是,我认为修改引用计数而不更改所有权实际上是徒劳的.我期望的是每个包含原始值(浮点数,整数等)的变量总是有自己的值,而不是引用同一个对象.
在执行我的简单测试代码时,我发现上面的Num_kind
分支中的断点永远不会到达:
def some_function(x, y):
return (x+y)*?x-y)
a = some_function(666666,66666)
print a
b = a …
Run Code Online (Sandbox Code Playgroud) python ×4
autoboxing ×1
clone ×1
copy ×1
cpython ×1
identifier ×1
java ×1
list ×1
pointers ×1
terminology ×1
type-systems ×1
types ×1
variables ×1