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)
有什么我可以通过实际参考传递变量吗?
是否可以在Python中声明变量,如此?:
var
Run Code Online (Sandbox Code Playgroud)
所以它初始化为None?似乎Python允许这样做,但是一旦你访问它,它就会崩溃.这可能吗?如果没有,为什么?
编辑:我想这样做的情况:
value
for index in sequence:
if value == None and conditionMet:
value = index
break
Run Code Online (Sandbox Code Playgroud)
该__debug__变量很方便,部分原因是它影响每个模块.如果我想创建另一个以相同方式工作的变量,我该怎么做?
变量(让我们是原始的并称之为'foo')并不一定是真正的全局变量,因为如果我在一个模块中更改foo,它会在其他模块中更新.如果我可以在导入其他模块之前设置foo然后他们会看到相同的值,我会没事的.
据我所知,Python中的变量只是指针.
基于此规则,我可以假设此代码段的结果:
i = 5
j = i
j = 3
print(i)
Run Code Online (Sandbox Code Playgroud)
会的3.但是我得到了一个意想不到的结果,是的5.
此外,我的Python书确实涵盖了这个例子:
i = [1,2,3]
j = i
i[0] = 5
print(j)
Run Code Online (Sandbox Code Playgroud)
结果将是[5,2,3].
我理解错了什么?
我原本以为Python是一种纯粹的传递引用语言.
来自C/C++我不禁想到内存管理,而且很难把它从我的头脑中解脱出来.因此,我试图从Java的角度来考虑它,并将所有内容都考虑在内,而不是原始内容作为参考传递.
问题:我有一个列表,其中包含一组用户定义类的实例.
如果我使用for-each语法,即:
for member in my_list:
print(member.str);
Run Code Online (Sandbox Code Playgroud)
是否member相当于对象的实际引用?
它是否相当于:
i = 0
while i < len(my_list):
print(my_list[i])
i += 1
Run Code Online (Sandbox Code Playgroud)
我认为不是,因为当我想要替换时,它不起作用,也就是说,这不起作用:
for member in my_list:
if member == some_other_obj:
member = some_other_obj
Run Code Online (Sandbox Code Playgroud)
在列表中进行简单的查找和替换.可以在for-each循环中完成,如果是,怎么做?另外,我是否只需要使用随机访问语法(方括号),或者什么都不会工作,我需要删除该条目,并插入一个新条目?即:
i = 0
for member in my_list:
if member == some_other_obj:
my_list.remove(i)
my_list.insert(i, member)
i += 1
Run Code Online (Sandbox Code Playgroud) 为什么变量L在sorting(L)函数调用中被操纵?在其他语言中,L的副本将sorting()作为副本传递给任何更改,以便任何更改x都不会更改原始变量?
def sorting(x):
A = x #Passed by reference?
A.sort()
def testScope():
L = [5,4,3,2,1]
sorting(L) #Passed by reference?
return L
>>> print testScope()
>>> [1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud) 我有以下的代码和变量,我想找到什么样的变量a,a1,a2,b,b1,和b2参考代码已经执行之后.
def do_something(a, b):
a.insert(0, "z")
b = ["z"] + b
a = ["a", "b", "c"]
a1 = a
a2 = a[:]
b = ["a", "b", "c"]
b1 = b
b2 = b[:]
do_something(a, b)
Run Code Online (Sandbox Code Playgroud)
我尝试的解决方案如下:
a = ["z", "a", "b", "c"]
a1 = ["a", "b", "c"]
a2 = ["a", "b", "c"]
b = ["z" "a", "b", "c"]
b1 = ["a", "b", "c"]
b2 = ["a", "b", "c"] …Run Code Online (Sandbox Code Playgroud) 对于我正在研究的项目,我正在实现一个链表数据结构,它基于一对的概念,我定义为:
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) 我们来看一个简单的代码:
y = [1,2,3]
def plusOne(y):
for x in range(len(y)):
y[x] += 1
return y
print plusOne(y), y
a = 2
def plusOne2(a):
a += 1
return a
print plusOne2(a), a
Run Code Online (Sandbox Code Playgroud)
'y'的值发生变化但值'a'保持不变.我已经知道这是因为一个是可变的而另一个不是.但是如何更改代码以使函数不更改列表?
例如,要做类似的事情(为了简单起见,使用伪代码):
a = [1,2,3,...,n]
function doSomething(x):
do stuff with x
return x
b = doSomething(a)
if someOperation(a) > someOperation(b):
do stuff
Run Code Online (Sandbox Code Playgroud)
编辑:抱歉,我在嵌套列表上有另一个问题.看到这段代码:
def change(y):
yN = y[:]
for i in range(len(yN)):
if yN[i][0] == 1:
yN[i][0] = 0
else:
yN[i][0] = 1
return yN …Run Code Online (Sandbox Code Playgroud)