1、python的值传递和引用传递区别,哪些类型值传,哪些是引用传递? 值传递和引用传递区别:依据对象是否可变来确定 和其他语言不一样,传递参数的时候,python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值‘来传递对象。 python一般内部赋值变量的话,都是传个引用变量,和C语言的传地址的概念差不多。可以用id()来查询内存地址 如果a=b的话, a和b的地址是相同的;如果只是想拷贝,那么就得用 a=b[:]。 # -*- coding: cp936 -*- #值传递 def f1(aa): aa=1 print "id(aa)=" , id(aa) print aa bb=123 print "id(bb)=" ,id(bb) f1(bb) print bb #引用传递 def f2(aa): aa[0]=[1] print "id(aa)=" ,id(aa) print aa bb=[123] print "id(bb)=" ,id(bb) f2(bb) print bb >>> id(bb)= 30778664 id(aa)= 30778144 1 123 id(bb)= 44761936 id(aa)= 44761936 [[1]] [[1]] >>> 2、使用python编写一个命令程序:里面保存了若干用户成员的信息,用户只有登陆后才能查看这些用户的信息。即:用户启动python脚本,然后输入用户名密码登陆成功后,使用命令可以查看其他用户信息 # -*- coding: cp936 -*- class MyUser(object): def __init__(self,username,password): self.username=username self.password=password def __del__(self): pass def __str__(self): return str(‘username=%s,password=%s‘ % (self.username,self.password)) def __eq__(self,other): return self.username==other.username and self.password==other.password import pickle dir(pickle) user1=MyUser(‘karliao‘,‘123456‘) user2=MyUser(‘test‘,‘123‘) fa=open(‘e:/aa.txt‘,‘w‘) pickle.dump(user1,fa,2) ##0->文本形式、1,2->二进制形式 pickle.dump(user2,fa,2) fa.close() fr=open(‘e:/aa.txt‘,‘r‘) users=[] while True: try: user=pickle.load(fr) users.append(user) except EOFError,e: break username=raw_input(‘Please input your username:‘) password=raw_input(‘Please input your password:‘) curUser=MyUser(username,password) if curUser in users: for user in users: print user >>> Please input your username:test Please input your password:123 username=karliao,password=123456 username=test,password=123 >>> ================================ RESTART ================================ >>> Please input your username:test Please input your password:111 >>> --eof--
时间: 2024-10-16 17:38:56