我只是在学习Objective-C,我想知道为什么以下代码会导致错误?
Person *p = [[Person alloc] init];
Person *p = [[Person alloc] init];
Run Code Online (Sandbox Code Playgroud)
在这种情况下,第二行给出一个错误,指出已经定义了"p"指针.
这对我来说很有意义; 但是,如果无法重新定义指针,那么为什么以下代码有效?
for(int i = 0; i<10; i+=1) {
Person *p = [[Person alloc] init];
}
Run Code Online (Sandbox Code Playgroud)
当我在XCode中输入它时,它不会给出任何错误,它编译并运行得很好.在这种情况下,我希望循环只是重新定义"p"指针,类似于顺序声明它们,但事实并非如此.
有没有人解释为什么会这样?
我在OS X 10.10中使用pip安装了iPython,它给了我"ipython"和"ipython2"命令,这些命令运行得很好,但它们使用OS X的默认python版本2.7.9.我下载并安装了Python3.4的最新版本,可以使用命令"python3"加载它,但找不到让iPython使用这个版本的python的方法.iPython Web站点声明该包可以与python版本3.3及更高版本一起使用,但是我找不到任何关于如何更改所使用的默认python版本的指令.
到目前为止,我发现iPython的jupyter包在/ usr/local/share/jupyter/kernels /中有一个内核规范,它只是一个名为"python2"的文件夹,其中包含指向系统的python 2.7.6的json文件. ,但改变这一点指向新的python3.4安装不起作用.我猜这个配置适用于ipython笔记本.
我也试过这里的方法:ipython读取错误的python版本
这样做我在/ user/local/bin /中复制了ipython2命令并编辑它以使用位于/Library/Frameworks/Python.framework/Versions/3.4/bin/python3的python3解释器,但是,这给了我错误"ImportError:没有名为'IPython'的模块",这表明python3安装没有安装ipython.
为了解决这个问题,我尝试卸载ipython并使用pip重新安装它,但它只是针对系统的Python 2.7安装而没有为python3做任何事情.
有谁知道如何配置iPython使用不同的python版本,甚至为python3安装单独的ipython安装?最终根据我的需要快速来回切换会很不错.
这是我的类文件(称为 myclasses.py):
class wave:
def __init__(self, name = "", xdelta = 1)
self.name = name
self.xdelta = xdelta
def loadbinary(bpath):
print(bpath)
Run Code Online (Sandbox Code Playgroud)
现在我已经去掉了其他细节(加载二进制文件代码等),当我运行以下命令时,我得到了一个错误输出:
import myclasses
a = myclasses.wave
a.loadbinary('TEST')
Run Code Online (Sandbox Code Playgroud)
错误:
TypeError: loadbinary() missing 1 required positional argument: 'bpath'
Run Code Online (Sandbox Code Playgroud)
我试过将 loadbinary 定义更改为“loadbinary(self, bpath)”,但它给出了相同的错误。我也试过用“pass”替换“print”代码,让它什么都不做,但这仍然给我错误。我也试过运行以下命令:
a.loadbinary(bpath='TEST')
Run Code Online (Sandbox Code Playgroud)
...但这将错误更改为:loadbinary() 缺少 1 个必需的位置参数:'self'
在这一点上,我不确定发生了什么。类定义是基本的,不从其他类继承,据我所知,遵循此处显示的类的 Python 文档中的代码:https : //docs.python.org/2/tutorial/classes.html
我使用的是 Python 3.4.3,这发生在运行在 PyCharm 4.5.1 中的 iPython 3.1.0 中。如果我直接在命令提示符(OS X 终端)下在 iPython 3.1.0 中运行它,我会得到以下错误输出:
unbound method loadbinary() must be called with wave instance as first argument (got str …Run Code Online (Sandbox Code Playgroud) 谁能解释为什么这在 Objective-C 中有效?我希望它给出一个错误,因为一个对象被分配给一个 int 变量。我知道它确实有效,这很棒,但我想知道为什么允许这样做?
int i = [NSNumber numberWithInt:123];
Run Code Online (Sandbox Code Playgroud)
此外,这似乎存储了错误的值(即,在我的系统上,当我使用 NSLog 打印出“i”的值时,我得到的是“252711”而不是 123);但是,只有在我的主代码中声明和分配变量时。如果我将其声明为对象的实例变量,然后使用键值编码为其赋值,则它可以正常工作:
对象实例变量...
@interface myObject : NSObject
{
int anInt;
}
Run Code Online (Sandbox Code Playgroud)
主要代码...
[myObject setValue:[NSNumber numberWithInt:123] forKey:@"anInt"];
NSLog(@"%@", [myObject valueForKey:@"anInt"]);
Run Code Online (Sandbox Code Playgroud)
这段代码按预期打印出“123”,但我不确定为什么在使用上面看似相似的方法时它无法正常工作。
在python中你可以采用如下数组:
a = [1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)
...然后运行以下列表推导以基于条件评估元素的True:
b = [True for num in a if num > 3]
Run Code Online (Sandbox Code Playgroud)
但是,这只返回大于3的元素的真值,因此我们得到:
[True, True, True]
Run Code Online (Sandbox Code Playgroud)
我知道我们可以使用多行方法,但有没有办法在这里扩展条件语句以使其保持在这种形式的一行,如果条件不满足则返回False?最后,我希望以上为"a"返回以下内容:
[False, False, False, True, True, True]
Run Code Online (Sandbox Code Playgroud)