Python сам изменяет целое число в Float

#python #floatin&-point #inte&er

#python #с плавающей запятой #целое

Вопрос:

Я пытаюсь выучить Python (у меня 2.5.4), написав игру snake, но я застрял. Некоторые целые числа превращаются в числа с плавающей запятой и продолжают меняться случайным образом, по крайней мере, с моей точки зрения 🙂

Проблема в том, что Snake.spawnPoint изменяется с помощью Cam.move()

 print Snake.spawnPoint # first time, this returns '[25, 20]' ,which is &ood.
Cam.Move()
print Snake.spawnPoint # after the method, the value is '[26.0, 21.0]', and that's bad
  

После этого они просто перемещаются.

И это метод: (он не имеет ничего общего с spawnPoint

 def Move(self):
    self.vel[0] =(self.tar&et[0]-self.cen[0])*self.k
    self.vel[1] =(self.tar&et[1]-self.cen[1])*self.k
    if    self.vel[0] &&t; self.friction: self.vel[0]-= self.friction
    elif  self.vel[0] < self.friction: self.vel[0] = self.friction
    else: self.vel[0] = 0
    if    self.vel[1] &&t; self.friction: self.vel[1]-= self.friction
    elif  self.vel[1] < self.friction: self.vel[1] = self.friction
    else: self.vel[1]=0
    self.cen[0] =self.vel[0]
    self.cen[1] =self.vel[1]
  

spawnPoint — это константа, которую я добавляю к телу змеи, когда она появляется. Мне нравится, чтобы это был список, потому что тело змеи состоит из списков, а метод рендеринга используется index() для выполнения различных действий.

Похоже, код здесь не подходит, поэтому я заархивировал его. Может кто-нибудь взглянуть на это? Спасибо http://www.mediafire.com/?zdcx5s93q9hxz4o

Комментарии:

1. пожалуйста, попробуйте сократить код до минимального примера, показывающего вашу проблему (это также может помочь вам найти проблему самостоятельно)

2. ну, я не могу уменьшить его, потому что я не знаю, что не так, но я знаю, что ‘ Snake.spawnPoint ‘ изменяется с помощью ‘ Cam.move() ‘ , я забыл упомянуть об этом в описании

3. @andrew: Вы могли бы просто поместить два оператора print вокруг места, когда целое число изменяется на float, чтобы увидеть, действительно ли это происходит. Вы делаете там какое-либо деление?

4. Пожалуйста, прочитайте pep8 и используйте правильное форматирование и отступы, этот код режет мне глаза.

5. что ж.. должен ли я изменять код, чтобы камера могла двигаться плавно? (у меня есть скорость, которая изменяется небольшими величинами)

Ответ №1:

Целые числа превращаются в числа с плавающей запятой, если вы объединяете их в выражении, то есть умножении, сложении, вычитании (не обязательно делении). Скорее всего, некоторые из ваших переменных являются плавающими, например self.friction.

значения с плавающей запятой сами по себе не преобразуются обратно в целые числа, только через int(). Если вы наблюдаете что-то еще, вы наблюдаете это неправильно.

Похоже, что ваш метод Move косвенно изменяет «spanwPoint». Я не знаю, ожидаемо ли такое поведение для вас, но это, вероятно, означает, что у вас есть две ссылки, указывающие на один и тот же список. Например.

 self.spawnPoint = [1, 0]
self.vel = self.spawnPoint # Does not make a copy!
self.vel[0]  = 0.1
self.vel[1]  = 0.2
  

приведет к тому, что self.spawnPoint (также) будет [1.1, 0.2]

Комментарии:

1. ммм .. у меня довольно много методов перемещения: D, на какой из них вы ссылаетесь?

2. Похоже, Camera.SnapTo() это было бы причиной.

3. Спасибо! я застрял на нем в течение нескольких дней, теперь я могу вернуться к веселью :), / так можно ли использовать spawnPoint [:] для создания копии, если это?

Ответ №2:

В Python (как и во многих других языках) любая простая арифметическая операция (например, ,-, /,*), включающая целое число и значение с плавающей запятой, приводит к ответу, который является значением с плавающей запятой. Целые числа никогда не превращаются в числа с плавающей запятой, это результат операции, который возвращается в виде числа с плавающей запятой.

Обратите внимание, что результат операций, включающих только целые числа, возвращается как целое число (я использую слово inte&er для обозначения обоих int и lon& в Python).