在Python中通过引用传递整数

2020/12/07 10:21 · python ·  · 0评论

如何在Python中通过引用传递整数?

我想修改传递给函数的变量的值。我读过Python中的所有内容都是按值传递的,但是必须有一个简单的技巧。例如,在Java中,你可以通过引用类型的IntegerLong等等。

  1. 如何通过引用将整数传递给函数?
  2. 最佳做法是什么?

在Python中,这种方式不太有效。Python将引用传递给对象。在函数内部,您有一个对象-您可以随意更改该对象(如果可能)。但是,整数是不可变的一种解决方法是在可以更改的容器中传递整数:

def change(x):
    x[0] = 3

x = [1]
change(x)
print x

这充其量是丑陋的/笨拙的,但是您不会在Python中做得更好。原因是因为在Python中,赋值(=)接受右侧对象结果的任何对象,并将其绑定到左侧对象*(或将其传递给适当的函数)。

了解了这一点,我们可以看到为什么无法更改函数内部不可变对象的值的原因-您不能更改其任何属性,因为它是不可变的,并且您不能仅给新的“变量”赋值值,因为您实际上是在创建一个新对象(与旧对象不同),并为其赋予旧对象在本地名称空间中的名称。

通常,解决方法是简单地返回所需的对象:

def multiply_by_2(x):
    return 2*x

x = 1
x = multiply_by_2(x)

*在上述第一个示例中,3实际上传递给x.__setitem__

您需要通过引用传递的大多数情况是,您需要将多个值返回给调用方。“最佳实践”是使用多个返回值,这在Python中比在Java等语言中要容易得多。

这是一个简单的例子:

def RectToPolar(x, y):
    r = (x ** 2 + y ** 2) ** 0.5
    theta = math.atan2(y, x)
    return r, theta # return 2 things at once

r, theta = RectToPolar(3, 4) # assign 2 things at once

不完全直接传递值,而是像传递值一样使用它。

x = 7
def my_method():
    nonlocal x
    x += 1
my_method()
print(x) # 8

注意事项:

  • nonlocal 在python 3中引入
  • 如果封闭范围是全局范围,请使用global代替nonlocal

确实,最佳做法是退后一步,然后询问您是否真的需要这样做。为什么要修改传递给函数的变量的值?

如mgilson的答案所示,如果您需要快速破解,最快的方法是传递一个list保留整数,并[0]在每次使用时坚持使用该整数

如果您需要将其用于更重要的事情,请编写一个class具有int作为属性的,以便您可以对其进行设置。当然,这会迫使您为类和属性命名,如果您什么都没想到,请返回并再次阅读该句子几次,然后使用list

更一般而言,如果您尝试将某些Java习惯用法直接移植到Python,那么您做错了。即使有直接对应的内容(如static/ @staticmethod),您仍然不想在大多数Python程序中使用它,只是因为您要在Java中使用它。

在Python中,每个值都是引用(指向对象的指针),就像Java中的非基本体一样。另外,像Java一样,Python仅按值传递。因此,从语义上讲,它们几乎相同。

既然您在问题中提到Java,那么我想看看您如何实现Java的目标。如果您可以用Java展示它,那么我可以展示如何用Python完全等效地展示它。

numpy的单元素数组是可变的,但对于大多数用途,它可以被就好像它是一个数值蟒变量进行评价。因此,它比单元素列表更方便使用按引用编号的容器。

    import numpy as np
    def triple_var_by_ref(x):
        x[0]=x[0]*3
    a=np.array([2])
    triple_var_by_ref(a)
    print(a+1)

输出:

3

也许这不是pythonic的方式,但是您可以这样做

import ctypes

def incr(a):
    a += 1

x = ctypes.c_int(1) # create c-var
incr(ctypes.ctypes.byref(x)) # passing by ref
class PassByReference:
    def Change(self, var):
        self.a = var
        print(self.a)
s=PassByReference()
s.Change(5)     

也许比length-1列表技巧更能自我记录的是旧的空类型技巧:

def inc_i(v):
    v.i += 1

x = type('', (), {})()
x.i = 7
inc_i(x)
print(x.i)

在Python中,所有内容均按值传递,但如果要修改某些状态,则可以更改传递给方法的列表或对象内的整数值。

正确的答案是使用一个类,然后将值放入该类中,这使您可以完全按需传递引用。

class Thing:
  def __init__(self,a):
    self.a = a
def dosomething(ref)
  ref.a += 1

t = Thing(3)
dosomething(t)
print("T is now",t.a)

本文地址:http://python.askforanswer.com/zaipythonzhongtongguoyinyongchuandizhengshu.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!