Python文档似乎不清楚参数是通过引用还是值传递,以下代码生成未更改的值'Original'
class PassByReference:
def __init__(self):
self.variable = 'Original'
self.change(self.variable)
print(self.variable)
def change(self, var):
var = 'Changed'
Run Code Online (Sandbox Code Playgroud)
有什么我可以通过实际参考传递变量吗?
我对不可变类型是多么困惑.我知道该float对象被认为是不可变的,我的书中有这种类型的例子:
class RoundFloat(float):
def __new__(cls, val):
return float.__new__(cls, round(val, 2))
Run Code Online (Sandbox Code Playgroud)
这是因为类结构/层次结构被认为是不可变的吗?意思float是在类的顶部并且是它自己的方法调用.类似于这种类型的例子(即使我的书说dict是可变的):
class SortedKeyDict(dict):
def __new__(cls, val):
return dict.__new__(cls, val.clear())
Run Code Online (Sandbox Code Playgroud)
虽然可变的东西在类中有方法,但是这种类型的例子:
class SortedKeyDict_a(dict):
def example(self):
return self.keys()
Run Code Online (Sandbox Code Playgroud)
另外,对于最后一个class(SortedKeyDict_a),如果我将这种类型的集合传递给它:
d = (('zheng-cai', 67), ('hui-jun', 68),('xin-yi', 2))
Run Code Online (Sandbox Code Playgroud)
在不调用example方法的情况下,它返回一个字典.SortedKeyDictwith 将其__new__标记为错误.我尝试将整数传递给RoundFloat类,__new__并且它没有标记错误.
我在Numpy的Python 2.6.5中遇到了一个奇怪的问题.我分配一个numpy数组,然后将一个新变量等同于它.当我对新数组执行任何操作时,原始值也会更改.这是为什么?请参阅下面的示例.请启发我,因为我对Python很新,而且编程一般.
-Sujan
>>> import numpy as np
>>> a = np.array([[1,2],[3,4]])
>>> b = a
>>> b
array([[1, 2],
[3, 4]])
>>> c = a
>>> c
array([[1, 2],
[3, 4]])
>>> c[:,1] = c[:,1] + 5
>>> c
array([[1, 7],
[3, 9]])
>>> b
array([[1, 7],
[3, 9]])
>>> a
array([[1, 7],
[3, 9]])
Run Code Online (Sandbox Code Playgroud) 有这个代码:
# assignment behaviour for integer
a = b = 0
print a, b # prints 0 0
a = 4
print a, b # prints 4 0 - different!
# assignment behaviour for class object
class Klasa:
def __init__(self, num):
self.num = num
a = Klasa(2)
b = a
print a.num, b.num # prints 2 2
a.num = 3
print a.num, b.num # prints 3 3 - the same!
Run Code Online (Sandbox Code Playgroud)
问题:
可能重复:
对象和基本类型的分配
a = [1,2,3]
b = a
print b is a
Run Code Online (Sandbox Code Playgroud)
此代码打印True.为什么?如果两个变量指向同一个对象,则"is"仅返回True,在这种情况下,它们是具有相同值的不同对象."=="将返回True,但"is"不应该返回True.
但是,自从
b.reverse()
print a,b
Run Code Online (Sandbox Code Playgroud)
打印[3,2,1] [3,2,1],似乎就解释器而言,它们是相同的对象,并且b上的操作将自动在a上执行.再次,为什么?我以前从未见过这样的事情.