从这个链接:我如何通过引用传递变量?我们知道,当Python作为参数传递给函数时,Python将复制一个字符串(一个不可变类型变量),但我认为如果字符串很大,它将浪费内存.在许多情况下,我们需要使用函数来包装字符串的一些操作,所以我想知道如何更有效地执行它?
假设我有list参数的功能,并且在我的体内我想通过将数组的元素复制到列表来修改传递的列表:
def function1 (list_arg):
a = function2() #function2 returns an array of numbers
list_arg = list(a)
list1 = [0] * 5
function1(list1)
list1
[0,0,0,0,0]
Run Code Online (Sandbox Code Playgroud)
这样做时,它不起作用.执行后function1(list1),list1保持不变.那么,如何使用与数组相同的元素(数字)function1返回? list1a
我知道我不应该在循环中修改列表,但出于好奇,我想知道为什么以下两个示例之间的迭代次数不同.
例1:
x = [1, 2, 3, 4, 5]
for i, s in enumerate(x):
del x[0]
print(i, s, x)
Run Code Online (Sandbox Code Playgroud)
例2:
x = [1,2,3,4,5]
for i, s in enumerate(x):
x = [1]
print(i, s, x)
Run Code Online (Sandbox Code Playgroud)
示例1仅运行3次,因为何时i==3,len(x)==2.
尽管示例2运行了5次len(x)==1.
所以我的问题是,是否在循环开始时enumerate生成完整的(index, value)对列表并迭代它?或者它们是在循环的每次迭代中生成的?
我假设Python中的序列类型是值类型.事实证明它们是引用类型(意味着当分配给新变量但引用时,不会复制变量的值).所以现在我想知道,Python中的值类型是什么?也就是说,我可以将Python中的哪些类型分配给新变量而不必担心变量被引用?
假设我有这段代码:
my_dict = {}
default_value = {'surname': '', 'age': 0}
# get info about john, or a default dict
item = my_dict.get('john', default_value)
# edit the data
item[surname] = 'smith'
item[age] = 68
my_dict['john'] = item
Run Code Online (Sandbox Code Playgroud)
如果我们现在检查default_value的值,问题就变得清晰了:
>>> default_value
{'age': 68, 'surname': 'smith'}
Run Code Online (Sandbox Code Playgroud)
很明显,它my_dict.get()没有返回default_value 的值,而是返回指针(?).
可以通过将代码更改为:
item = my_dict.get('john', {'surname': '', 'age': 0})
Run Code Online (Sandbox Code Playgroud)
但这似乎不是一个很好的方法.有什么想法,评论?
当我想尝试python版本时遇到了这个问题:https://leetcode.com/problems/first-missing-positive/discuss/17071/My-short-c++-solution-O( 1)-space- and -准时
我不确定为什么a[0], a[a[0]] = a[a[0]], a[0]这个不进行交换?
>>> nums
[2, 1, 0]
>>> a = [2,1,0]
>>> a[0], a[a[0]] = a[a[0]], a[0]
>>> a
[2, 1, 0]
>>> a[0]
2
>>> a[0],a[2] = a[2], a[0]
>>> a
[0, 1, 2]
Run Code Online (Sandbox Code Playgroud)
我的猜测是a,b = b,语法的实现类似于:
tmp = a[0] (tmp = 2)
a[0] = a[a[0]] (a[0] = a[2] = 0)
a[a[0]] = tmp (a[a[0]] = a[0] = tmp = 2)
Run Code Online (Sandbox Code Playgroud)
然后我检查了C++中swap函数的实现.我对C++一无所知,但看起来这个想法是一样的:http: //www.cplusplus.com/reference/algorithm/swap/
The behavior …Run Code Online (Sandbox Code Playgroud) 我一直在运行Python脚本,它们会调用一些函数,比如F1(x)和F2(x),看起来有点像这样:
x = LoadData()
for j in range(N):
y = F1(x[j])
z[j] = F2(y)
del y
SaveData(z)
Run Code Online (Sandbox Code Playgroud)
如果我保持"del y"线,性能会快得多.但我不明白为什么这是真的.如果我不使用"del y",那么我很快就会耗尽RAM而不得不求助于虚拟内存,而且一切都在慢慢爬行.如果我使用"del y"购买,那么我反复刷新并为y重新分配内存.我想做的是作为静态内存,并在每次F1(x)调用时重用内存.但据我所知,这不是正在发生的事情.
此外,不确定它是否相关,但我的数据包括numpy数组.
假设我有两个Python函数,函数1和函数2.
函数1将调用函数2,并且参数是大数据(例如,具有10万个元素的字典).
我想知道在函数1中调用函数2之间是否存在任何性能差异,这意味着我需要传递大数据参数,并直接在函数1中实现函数2,这意味着我不需要传递大数据参数.
谢谢.
PS:我认为关键问题是Python如何通过参数,值或参考(指针)传递参数?
编辑:这似乎是一个混乱的问题.如何通过引用传递变量?是一个很好的答案.
我不确定我是否通过传递函数参数的对象样式理解Python调用的概念(在此处解释http://effbot.org/zone/call-by-object.htm).似乎没有足够的例子来澄清这个概念(或者我的google-fu可能很弱!:D)
我写了这个有点人为的Python程序,试图理解这个概念
def foo( itnumber, ittuple, itlist, itdict ):
itnumber +=1
print id(itnumber) , itnumber
print id(ittuple) , ittuple
itlist.append(3.4)
print id(itlist) , itlist
itdict['mary'] = 2.3
print id(itdict), itdict
# Initialize a number, a tuple, a list and a dictionary
tnumber = 1
print id( tnumber ), tnumber
ttuple = (1, 2, 3)
print id( ttuple ) , ttuple
tlist = [1, 2, 3]
print id( tlist ) , tlist
tdict = tel = {'jack': 4098, 'sape': …Run Code Online (Sandbox Code Playgroud) 我最近越来越多地使用python代替c/c ++,因为它将我的编码时间缩短了几倍.与此同时,当我处理大量数据时,我的python程序运行的速度开始变得比c慢很多.我想知道这是否是由于我使用大型对象/数组效率低下.是否有关于如何通过numpy/python处理内存的全面指南?当事物通过引用和按值传递时,当事物被复制时,何时复制,什么类型是可变的,哪些不是.
python ×10
list ×2
algorithm ×1
dictionary ×1
enumerate ×1
function ×1
iterator ×1
loops ×1
memory ×1
numpy ×1
performance ×1
reference ×1
sequences ×1
string ×1
value-type ×1