在某些语言中,您可以使用特殊的保留字(如ref或val)通过引用或值传递参数.当您将参数传递给Python函数时,它永远不会在离开函数时改变参数的值.唯一的方法是使用全局保留字(或者我当前理解它).
例1:
k = 2
def foo (n):
n = n * n #clarity regarding comment below
square = n
return square
j = foo(k)
print j
print k
Run Code Online (Sandbox Code Playgroud)
会表现出来
>>4
>>2
Run Code Online (Sandbox Code Playgroud)
显示k是不变的
在此示例中,变量n永远不会更改
例2:
n = 0
def foo():
global n
n = n * n
return n
Run Code Online (Sandbox Code Playgroud)
在此示例中,变量n已更改
在Python中是否有任何方法可以调用函数并告诉Python 参数是值还是引用参数而不是使用全局?
其次,在A级剑桥考试,他们现在说一个函数返回一个单一而过程返回值超过一个值.在80年代,我被教导了一个函数有一个返回语句,而程序没有.为什么现在不正确?
我正在测试我的新版SWI prolog并不断遇到错误:singleton变量.
例:
member(X,[X|T]).
member(X,[X|T]) :- member(X,T).
Run Code Online (Sandbox Code Playgroud)
找到列表的成员,例如:
member(yolands,[yolanda,tim])
X = yes
Run Code Online (Sandbox Code Playgroud)
但相反,我得到X和T 的单例变量错误
如果我做以下事情:
member(X,[X|_]).
member(X,[_|T]) :- member(X,T).
Run Code Online (Sandbox Code Playgroud)
它有效,但看起来很难看!
任何人都可以解释为什么允许单个变量和这个ANSI标准吗?
我正在剑桥考试委员会教授A Level课程.实际论文中的一个典型问题是:
在您选择的编程语言中,声明一个包含十个整数的数组,然后对其进行初始化.
我有这个:
myArray = [] #create the array
for i in range(10): # initializes to 0
myArray.append(0)
Run Code Online (Sandbox Code Playgroud)
我相信这是大多数人在Python中会做的事情?然而,与Pascal等不同,它并没有严格地回答这个问题,因为Python中的列表本质上是动态数组,并且增加了不限制每个元素的数据类型的问题.我可以声明一个特定的大小数组,并在Pascal中输入,而不是一个空的动态列表,没有任何类型的循环并限制数组的类型?
像(伪代码)的东西:
myArray[10] : integer
Run Code Online (Sandbox Code Playgroud)
这是一个非商业性的问题,但是一个教育问题.
微软当然很难解决这个简单的问题.如何在我的Visual Studio社区版Python上安装sqlite3或Pmw.我通常把文件放在site packages文件夹中.使用Visual studio,他们谈论数据包管理器,但它在哪里?这真的很难吗?
可能重复:
如何在Python中初始化二维数组?
在解决关于二维数组的一个简单问题时,我遇到了一个解决方案,该解决方案解释了如何使用重载运算符在Python中声明一个解决方案.
例:
Myarray = [[0]*3]*3
Run Code Online (Sandbox Code Playgroud)
这会产生以下数组(列表)
[[0,0,0],[0,0,0],[0,0,0]]
Run Code Online (Sandbox Code Playgroud)
在您使用之前,这似乎很好:
如果您分配一个元素,例如:
Myarray [0][0] = 1
Run Code Online (Sandbox Code Playgroud)
你得到意想不到的输出:
[[1,0, 0],[1,0,0] , [1,0,0]]
Run Code Online (Sandbox Code Playgroud)
实际上同时分配了Myarray [1] [0]和Myarray [2] [0]
我的解决方案
Myarray = [[][][]]
for i in range(0,3):
for j in range (0,3):
Myarray[i].append(0)
Run Code Online (Sandbox Code Playgroud)
此解决方案按预期工作:
Marray[0][1] = 1
Run Code Online (Sandbox Code Playgroud)
给你
[[1,0, 0],[0,0,0] , [0,0,0]]
Run Code Online (Sandbox Code Playgroud)
有更简单的方法吗?这是一个A级剑桥问题的解决方案,与其他语言相比,对学生来说似乎太长了.
有没有办法将输出发送到打印机而不是Python中的屏幕?或者是否有可以从python中调用以打印文件的服务例程?也许我可以导入一个允许我这样做的模块?
我编写了一个程序,使用以下众所周知的公式计算自然对数的基数(在数学中称为e):
e =(1 + 1.0/n)**n
代码是:
def e_formula(lim):
n = lim
e = (1 + 1.0/n) **n
return e
Run Code Online (Sandbox Code Playgroud)
我设置了一个从10 1到10 100 迭代的测试:
if __name__ == "__main__":
for i in range(1,100):
print e_formula(10**i)
Run Code Online (Sandbox Code Playgroud)
然而以下结果在10**11左右爆炸.
shell的实际结果:
2.5937424601
2.70481382942
2.71692393224
2.71814592682
2.71826823719
2.7182804691
2.71828169413
2.71828179835
2.71828205201
2.71828205323
2.71828205336
2.71852349604
2.71611003409
2.71611003409
3.03503520655
1.0
我正在寻找一个原因,要么是在32位机器中超过浮点数限制的结果,要么是因为Python本身计算浮点数的方式.我不是在寻找更好的解决方案; 我只是想明白为什么会爆炸.
我正在尝试编写一个程序来向 A-level 学生说明使用 Python 进行引用调用和按值调用之间的区别。我成功地将可变对象作为变量传递给函数,但发现我也可以使用 ctypes 库执行相同的操作。
我不太明白它是如何工作的,因为byref()
ctype 库中有一个函数,但它在我的示例中不起作用。然而,通过调用一个没有byref()
它的函数确实有效!
我的工作代码:
"""
Program to illustrate call by ref
"""
from ctypes import * #allows call by ref
test = c_int(56) #Python call by reference eg address
t = 67 #Python call by value eg copy
#expects a ctypes argument
def byRefExample(x):
x.value= x.value + 2
#expects a normal Python variable
def byValueExample(x):
x = x + 2
if __name__ == "__main__":
print "Before call test is",test …
Run Code Online (Sandbox Code Playgroud) 我在互联网上使用scratch.mit.edu版本2.0并编写程序来评估后缀表达式.当我使用letter..of ...块逐字遍历输入字符串,例如:"23+"(后缀)时,它工作正常.
然后我添加一个..的字母..来识别一个空格键字符,这样用户就可以在表达式中插入空格,例如"2 3 +"
但是,似乎无法识别空白字符.我试过了
1) Lookahead = ""
2) Lookahead =' '
3) Lookahead =''
Run Code Online (Sandbox Code Playgroud)
其中没有一个能够找到遇到的空间.