标签:from 而不是 运算 应该 程序设计 无法 ret com 接受
无论对不变类型变量、可变对象赋值
不可变类型例子1a = 1
b = a
a = 3
print(a,b)
# 3 1可变类型例子2L1 = [1,2,3]
L2 = L1
L1 = 13
print(L1,L2)
# 13 [1, 2, 3]
L1 = [‘a‘,‘b‘,‘c‘]
print(L1,L2)
# [‘a‘, ‘b‘, ‘c‘] [1, 2, 3]
L1 = [1,2,3]
L2 = L1
L1[1] = 13
print(L1,L2)
# [1, 13, 3] [1, 13, 3]
L1 = [‘a‘,‘b‘,‘c‘]
print(L1,L2)
# [‘a‘, ‘b‘, ‘c‘] [1, 13, 3]
为什么说是调用方法修改属性呢?因为运算符重载中告诉我们,其实"[]"索引其实是自动调用了__getitem__方法(P713)。
代码1:def testImmutable(arg):
arg = 2
print(arg)
a = 1
testImmutable(a)
# 2
print(a)
# 1这个用"对变量赋新值都会断开对原值的引用,而成为新值的引用"解释即可,所以这样的函数无法修改不可变对象。当然,可变对象也是不可以修改代码2:def testMutable(arg):
arg = [‘a‘,‘b‘,‘c‘]
print(arg)
L = [1,2,3]
testMutable(L)
# [‘a‘, ‘b‘, ‘c‘]
print(L)
# [1, 2, 3](这一点可以跟后面补充内容部分的JS的例子做对比)但是我们可以用方法修改可变对象的属性代码3:def testAttr(args):
args.append(1.3)
a = [1.1,1.2]
print(a)
# [1.1, 1.2]
testAttr(a)
print(a)
# [1.1, 1.2, 1.3]******************************?******************************P530提到了一个陷阱也就是说我如果想要让形参默认为一个空列表,如果写成这样是有问题的:def saver(x=[]): # Saves away a list object
x.append(1) # Changes same object each time!
print(x)
saver([2]) # Default not used
# [2, 1]
saver() # Default used
# [1]
saver() # Grows on each call!
# [1, 1]
saver()
# [1, 1, 1]这是因为,这个空列表对象只是在def语句执行时被创建的,不会每次函数调用时都得到一个新的列表,所以每次新的元素加入后,列表会在原来的基础上变大,因为这个空列表在每次函数调用的时候都没有被重置正确写法如下:def saver(x=None):
if x is None: # No argument passed?
x = [] # Run code to make a new list each time
x.append(1) # Changes new list object
print(x)
saver([2])
# [2, 1]
saver() # Doesn‘t grow here
# [1]
saver()
# [1]
如下代码也会报错x = 11
def selector():
print(X)
X = 88
selector()
引用是C++中的概念,其操作符是: & ,这跟C中是取地址操作符一样,
但是意义不一样,C中没有引用的。 (切记 !)
传值,
是把实参的值赋值给行参
那么对行参的修改,不会影响实参的值
传地址
是传值的一种特殊方式,只是他传递的是地址,不是普通的如int
那么传地址以后,实参和行参都指向同一个对象
传引用
真正的以地址的方式传递参数
传递以后,行参和实参都是同一个对象,只是他们名字不同而已
?例如有人名叫王小毛,他的绰号是“三毛”。说“三毛”怎么怎么的,其实就是对王小毛说三道四。
int num = 10;
String str = "hello"; //String是一个引用类型
num = 20;
str = "java";‘
void foo(int value) {
value = 100;
}
foo(num); // num 没有被改变
void foo(String text) {
text = "windows";
}
foo(str); // str 也没有被改变
StringBuilder sb = new StringBuilder("iphone");
void foo(StringBuilder builder) {
builder.append("4");
}
foo(sb); // sb 被改变了,变成了"iphone4"。
StringBuilder sb = new StringBuilder("iphone");
void foo(StringBuilder builder) {
builder = new StringBuilder("ipad");
}
foo(sb); // sb 没有被改变,还是 "iphone"。
public class TestMain {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 10; i++) {
list.add(i);
}
add(list);
for (Integer j : list) {
System.err.print(j+",");;
}
System.err.println("");
System.err.println("*********************");
String a="A";
append(a);
System.err.println(a);
int num = 5;
addNum(num);
System.err.println(num);
}
static void add(List<Integer> list){
list.add(100);
}
static void append(String str){
str+="is a";
}
static void addNum(int a){
a=a+10;
}
}
var obj = {x : 1};
function foo(o) {
o = 100;
}
foo(obj);
console.log(obj.x); // 仍然是1, obj并未被修改为100.
他山之石,calling by share——python中既不是传址也不是传值
标签:from 而不是 运算 应该 程序设计 无法 ret com 接受
原文地址:http://www.cnblogs.com/xuanlvshu/p/6938610.html