Python中给实例赋值遇到的问题

silencereformer 2018-08-02 11:41:41
仅仅在学习Python,过程中遇到了一个让人非常头疼的问题,就是在类的成员函数中给实例中赋值为一个新的实例,在成员函数执行完毕之后,想要被赋值的实例并没有被赋值。语言组织能力差,直接上程序和运行结果给大家看吧。

class testClass(object):
def __init__(self):
self.item=None
pass
def add(self,data):
tempInstance=testClass()
tempInstance.item=data
self=tempInstance
print(self.item)
return tempInstance
pass
myInstance=testClass()
myInstance.add(5)
print(myInstance.item)


运行结果如图,可以看见,在函数运行的时,实例是被赋值了的,但是在函数执行完毕返回之后,实例又变为没有赋值的状态了,想请教各位这是为什么呢?
...全文
388 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
silencereformer 2018-08-03
  • 打赏
  • 举报
回复
引用 9 楼 chaleaoch_gmail 的回复:
https://stackoverflow.com/questions/1216356/is-it-safe-to-replace-a-self-object-by-another-object-of-the-same-type-in-a-meth

希望这个帖子对你有帮助.

感谢,我再研究研究
陈年椰子 2018-08-03
  • 打赏
  • 举报
回复
在一个实例里,对该实例的对应的类再创建一个实例,然后赋值给本身。看起来有些怪。
就像创建一个指针,然后指针指向指针本身,可以实现,但貌似没啥卵用。

最好有实际应用参考一下。
冯斯特罗 2018-08-03
  • 打赏
  • 举报
回复
https://stackoverflow.com/questions/1216356/is-it-safe-to-replace-a-self-object-by-another-object-of-the-same-type-in-a-meth

希望这个帖子对你有帮助.
冯斯特罗 2018-08-03
  • 打赏
  • 举报
回复
我并不知道原因,但是可以给你一点提示 供参考.
class testClass(object):
def __init__(self):
self.item = None
pass

def add(self, data):
print (self, 1)
tempInstance = testClass()
tempInstance.item = data
self = tempInstance
print (self, 2)
print(self.item)
return tempInstance

pass


myInstance = testClass()
myInstance.add(5)
print(myInstance.item)
print (myInstance, 3)


这是输出
(<__main__.testClass object at 0x0493CCD0>, 1)
(<__main__.testClass object at 0x048F6AD0>, 2)
5
None
(<__main__.testClass object at 0x0493CCD0>, 3)

引用 7 楼 silencereformer 的回复:
[quote=引用 3 楼 seakingx 的回复:]
不知道你要做什么, 如果只是赋值,改下代码即可实现。

class testClass(object):
def __init__(self):
self.item=None
pass
def add(self,data):
self.item = data
# tempInstance=testClass()
# tempInstance.item=data
# self=tempInstance
print(self.item)
# return tempInstance
pass
def get_item(self):
return self.item

myInstance=testClass()
myInstance.add(5)
print(myInstance.get_item())

额,我要实现的不是单单的赋值那么简单,但是为了方便表达,我将我遇到的问题抽象为一个简单的赋值问题。
就想知道为什么在我写的方法中,不能用一个实例给变量赋值呢。
第一个输出的5表示在方法内,self的data属性已经变为了5,但是后面的None又表示在add方法执行结束之后,myInstance实例的Data属性又从5变回了None。
我想知道的是,为什么属性会出现这种变化?究竟是解释器的某种机制将myInstance的Data属性做了还原,还是在将tempInstance赋值给self时,self本身指向的内存初心了变化呢?[/quote]
silencereformer 2018-08-02
  • 打赏
  • 举报
回复
引用 1 楼 chaleaoch_gmail 的回复:
关注,有答案了求告知.

不过在开发过程中没见过这么干的...

在实际开发中都只是对单独的属性赋值吗?
silencereformer 2018-08-02
  • 打赏
  • 举报
回复
引用 3 楼 seakingx 的回复:
不知道你要做什么, 如果只是赋值,改下代码即可实现。

class testClass(object):
def __init__(self):
self.item=None
pass
def add(self,data):
self.item = data
# tempInstance=testClass()
# tempInstance.item=data
# self=tempInstance
print(self.item)
# return tempInstance
pass
def get_item(self):
return self.item

myInstance=testClass()
myInstance.add(5)
print(myInstance.get_item())

额,我要实现的不是单单的赋值那么简单,但是为了方便表达,我将我遇到的问题抽象为一个简单的赋值问题。
就想知道为什么在我写的方法中,不能用一个实例给变量赋值呢。
第一个输出的5表示在方法内,self的data属性已经变为了5,但是后面的None又表示在add方法执行结束之后,myInstance实例的Data属性又从5变回了None。
我想知道的是,为什么属性会出现这种变化?究竟是解释器的某种机制将myInstance的Data属性做了还原,还是在将tempInstance赋值给self时,self本身指向的内存初心了变化呢?
silencereformer 2018-08-02
  • 打赏
  • 举报
回复
引用 3 楼 seakingx 的回复:
不知道你要做什么, 如果只是赋值,改下代码即可实现。

class testClass(object):
def __init__(self):
self.item=None
pass
def add(self,data):
self.item = data
# tempInstance=testClass()
# tempInstance.item=data
# self=tempInstance
print(self.item)
# return tempInstance
pass
def get_item(self):
return self.item

myInstance=testClass()
myInstance.add(5)
print(myInstance.get_item())

额,我要实现的不是单单的赋值那么简单,但是为了方便表达,我讲我遇到的问题抽象为一个简单的赋值问题。
就想知道为什么在我写的方法中,不能用一个实例给变量赋值呢。
silencereformer 2018-08-02
  • 打赏
  • 举报
回复
引用 4 楼 chaleaoch_gmail 的回复:
是的,看来lz不仅仅是python新手而且是编程新手呢.

Java里面,都不建议直接对属性复制呢,都是通过方法对属性进行复制.
如果你对上句感到迷茫,请忽略...

[quote=引用 2 楼 silencereformer 的回复:]
[quote=引用 1 楼 chaleaoch_gmail 的回复:]
关注,有答案了求告知.

不过在开发过程中没见过这么干的...

在实际开发中都只是对单独的属性赋值吗?[/quote][/quote]

额,不建议直接操作属性这是知道的,从本科开始老师的就开始反复强调,但这只是一个学习python的小demo,所并没有注意。
我问题的意思是为什么不能直接把一个类的变量赋值为另外一个实例。
冯斯特罗 2018-08-02
  • 打赏
  • 举报
回复
是的,看来lz不仅仅是python新手而且是编程新手呢.

Java里面,都不建议直接对属性复制呢,都是通过方法对属性进行复制.
如果你对上句感到迷茫,请忽略...

引用 2 楼 silencereformer 的回复:
[quote=引用 1 楼 chaleaoch_gmail 的回复:]
关注,有答案了求告知.

不过在开发过程中没见过这么干的...

在实际开发中都只是对单独的属性赋值吗?[/quote]
陈年椰子 2018-08-02
  • 打赏
  • 举报
回复
不知道你要做什么, 如果只是赋值,改下代码即可实现。

class testClass(object):
def __init__(self):
self.item=None
pass
def add(self,data):
self.item = data
# tempInstance=testClass()
# tempInstance.item=data
# self=tempInstance
print(self.item)
# return tempInstance
pass
def get_item(self):
return self.item

myInstance=testClass()
myInstance.add(5)
print(myInstance.get_item())

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧