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)
有什么我可以通过实际参考传递变量吗?
我发送了一个bool对象的引用,并在一个方法中对其进行了修改.方法完成后执行,方法外的bool值保持不变.
这让我相信Python的bool是通过值传递的.真的吗?其他Python类型的行为方式是什么?
对于我正在研究的项目,我正在实现一个链表数据结构,它基于一对的概念,我定义为:
class Pair:
def __init__(self, name, prefs, score):
self.name = name
self.score = score
self.preferences = prefs
self.next_pair = 0
self.prev_pair = 0
Run Code Online (Sandbox Code Playgroud)
where self.next_pair和self.prev_pair是分别指向上一个和下一个链接的指针.
要设置链表,我有一个看起来像这样的安装功能.
def install(i, pair):
flag = 0
try:
old_pair = pair_array[i]
while old_pair.next_pair != 0:
if old_pair == pair:
#if pair in remainders: remainders.remove(pair)
return 0
if old_pair.score < pair.score:
flag = 1
if old_pair.prev_pair == 0: # we are at the beginning
old_pair.prev_pair = pair
pair.next_pair = old_pair
pair_array[i] = pair …Run Code Online (Sandbox Code Playgroud) 如果有的话,Python的参数传递规则与C#的参数传递规则有什么主要区别?
我对Python非常熟悉,只是开始学习C#.我想知道我是否能够想到规则集是关于何时通过引用传递一个对象,或者对于C#的值是否与在Python中相同,或者如果存在一些我需要记住的关键差异.
基本上我使用的是应用程序的 C++ API,但是没有关于它的 python 访问的参考。一个变量由 ref 传递,如下所示:
GetPoint ( Point &p, Object obj )
Run Code Online (Sandbox Code Playgroud)
那么我该如何翻译成 Python 呢?是否有通过 ref 符号?
为什么:
>>> a = 1
>>> b = a
>>> a = 2
>>> print(a)
2
>>> print(b)
1
Run Code Online (Sandbox Code Playgroud)
...但:
>>> a = [3, 2, 1]
>>> b = a
>>> a.sort()
>>> print(b)
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
我的意思是,为什么变量真的被复制而迭代器只被引用?
好吧,我只是学习Python而且我遇到了一些奇怪的行为.我想垃圾收集器对此负责,但我不确定.
抱歉,我解读了这个问题
我想重现一些我在使用没有该库的库时得到的奇怪但我失败了.
所以第二次尝试:
我正在使用Autodesk Maya的python API.它只是围绕现有C++ API的python包装.
所以这段代码:
import maya.OpenMaya as om
Q = om.MQuaternion(1,2,3,4).conjugateIt()
P = om.MQuaternion(6,6,6,6)
print(Q[0],Q[1],Q[2],Q[3])
print(type(Q))
print(type(P))
Run Code Online (Sandbox Code Playgroud)
产生这个输出:
(6.0, 6.0, 6.0, 6.0)
<class 'maya.OpenMaya.MQuaternion'>
<class 'maya.OpenMaya.MQuaternion'>
Run Code Online (Sandbox Code Playgroud)
所以两者P,Q都是类型,MQuaternion但Q不保留它应该保存的数据.在这里你可以找到文档的MQuaternion类.conjugateIt是共轭的,并通过引用返回.
那么现在出了什么问题?
在C++中,我习惯做这样的事情.
complex<float> c = complex<float>(1,2).conjInPlace()
Run Code Online (Sandbox Code Playgroud)
conjInPlace()就是结合
但如果我在python中做类似的事情,我就会陷入困境
class testClass:
def __init__(self,_a,_b):
self.a = _a
self.b = _b
def alterMe(self):
self.b = 123
A = testClass(1,2)
A.alterMe()
print(A.a,A.b)
B = testClass(0,0)
B = testClass(3,4).alterMe()
print(B) …Run Code Online (Sandbox Code Playgroud) 设置变量.另一个变量设置为第一个.第一个改变了价值.第二个没有.从一开始就是编程的本质.
>>> a = 1
>>> b = a
>>> b = b - 1
>>> b
0
>>> a
1
Run Code Online (Sandbox Code Playgroud)
然后我将它扩展到Python列表.声明并附加列表.宣布另一个列表与第一个列表相同.第二个列表中的值发生变化.神秘的是,第一个列表中的值虽然没有直接作用,但也会发生变化.
>>> alist = list()
>>> blist = list()
>>> alist.append(1)
>>> alist.append(2)
>>> alist
[1, 2]
>>> blist
[]
>>> blist = alist
>>> alist.remove(1)
>>> alist
[2]
>>> blist
[2]
>>>
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
我如何防止这种情况发生 - 我希望alist对blist(不可变的,如果你愿意的话)的变化不感兴趣?
我正在寻找适当的术语来描述集合对象的这个众所周知的属性,更重要的是,当变量用于引用它们的元素时,堆栈图的变化方式如下:
>>> x = 5
>>> l = [x]
>>> x += 1
>>> l
[5]
>>> x
6
Run Code Online (Sandbox Code Playgroud)
列表对变量执行的操作的名称是什么,x以防止它被绑定到原始值的任何更改x?屏蔽?共享结构?列表绑定?使用这些条款的Google搜索没有任何回复.
这是一个更详细的例子(但遗憾的是没有定义).

我很抱歉再次重复同样的事情,但我已经搜索了但我还是无法解决我的问题......
如果我想更改单个"int"值,我是否必须创建列表?一团糟.它在C ...中更加舒适(如void函数(int a,b,c,*d,*e,*f))
这就是我要做的事情(我必须改变"d","e","f"):
d = 4
e = 9
f = 11
def function(a,b,c,d,e,f)
a = something
b = something
c = 1
d = 2
e = 3
f = 4
Run Code Online (Sandbox Code Playgroud)
话虽如此,我是否必须创建一个字典或列表来处理简单的数字?我还是个新手,但是我想知道最近解决这个问题的最佳解决方案是什么.
感谢你们.
python ×10
reference ×3
list ×2
variables ×2
boolean ×1
c ×1
c# ×1
definition ×1
immutability ×1
terminology ×1